本文内容
前言
上一篇文章 中,介绍了 MySQL 中的锁类型,其中行级锁分为 Record Lock、Gap Lock 和 Next-Key Lock,那一条 SQL 语句要加行级锁时,应该加那个锁?具体是怎么加的呢?本文就来讲讲 MySQL 行级锁的加锁规则是怎样的。
前言
上一篇文章 中,介绍了 MySQL 中的锁类型,其中行级锁分为 Record Lock、Gap Lock 和 Next-Key Lock,那一条 SQL 语句要加行级锁时,应该加那个锁?具体是怎么加的呢?本文就来讲讲 MySQL 行级锁的加锁规则是怎样的。
InnoDB 存储引擎是支持事务的,而事务有一个非常重要的特征是 原子性,即事务中的所有操作,要么全部完成,要么全部失败。
但是,在实际运行过程中,就会有出现某个 事务执行到一半 的情况,例如:
事务执行过程中 出现错误,如实例崩溃、突然断电宕机等;
开发人员在事务执行过程中手动执行 ROLLBACK 语句结束当前事务。
还有 两阶段提交时,在某时刻崩溃后,如果 binlog 还未刷盘,则要回滚这个事务。
在 select 执行流程 中,讲到了可以利用两阶段提交解决 redo log 和 binlog 一致性的问题。但是有两阶段提交有一个明显的问题,就是性能很差。主要体现在两个方面:
前言
在基础篇中知道了 select 语句执行的那套流程,一条 update 语句其实也会同样走一遍。
之前学习的 redo log,是属于 InnoDB 存储引擎层的,MySQL 的 Server 层 也有自己的日志,称为 binlog(归档日志)。
binlog 记录的是 全量日志,写完一个文件就会写下一个文件,所以 binlog 里有数据库的所有数据信息,非常适合用来做 备份和主从复制。
在上一篇文章中我们知道,为了提高数据库的读写性能,InnoDB 建立了一个缓冲区 Buffer Pool。Buffer Pool 被划分为多个缓冲页,这些缓冲页通过链表(链表中保存的是控制块)来管理。
在 Buffer Pool 中,常用的链表有 free 链表、flush 链表,还有一个就是我们今天的主角 — LRU 链表。
缓冲区的大小是有限的,那么当 缓冲区的内存不足时,就需要淘汰一些旧的缓冲页,再来存放新的。这个事情,就由 LRU 链表负责。
我们都知道,MySQL 中的数据都是放在 磁盘 上的,凡是跟磁盘打交道,基本上都需要在内存中建立 缓存,因为磁盘的读写速度非常慢。
例如,Linux 在内存和磁盘之间就建立了一个缓冲区 Buffers,主要有两个 好处:
根据加锁的范围,MySQL 中的锁分为 全局锁、表锁和行级锁。
全局锁和表级锁是在 Server 层实现的,而行级锁是在存储引擎层实现的。
全局锁,顾名思义会对整个 MySQL 实例加锁,也就是锁库中所有的表。
前言
我们都知道,Redis 是一个典型的 kv 数据库,即数据都是以 key-value 的形式来存储的。那么一个简单的 kv 数据库是如何实现的,它又包含什么内容呢?
Redis 是比较复杂的,它发展至今已经属于一个比较完善的 NoSQL 了,其中包含的模块也比较多,如果我们一开始学习 Redis 就往某个模块里钻,很容易找不到方向。
所以,我们先来简单的了解一下 kv 数据库是如何实现的,它应该包含哪些功能模块,然后再引申到 Redis。先做到纵览全局,再去细扣某个功能模块的实现,会得心应手很多。