多版本并发控制(Multi-Version Concurrency Control)是InnoDB引擎实现隔离级别(可重复读)的一种具体方式。
一、版本号
- 系统版本号:每开启一个事务,系统版本号就会自增
- 事务版本号:事务创建时的系统版本号
二、隐藏列
- 创建版本号:创建一个数据行快照时的系统版本号
- 删除版本号:如果快照的删除版本号大于事务版本号,说明该快照有效;否则表示该快照已经被删除。
三、Undo日志
MVCC使用的快照保存在日志中,该日志通过回滚指针把一个数据行的所有快照连接起来。

四、 实现过程
关键:开启一个事务时,该事务版本号肯定大于当前所有数据行的创建版本号
- SELECT
设读取某个数据行的事务为T。
T要读的数据行的创建版本号必须小于事务T的事务版本号,表明数据行已存在。
T要读的数据行的删除版本必须大于T的事务版本号,表明数据行还没被某个事务删除。 - INSERT
当前的系统版本号作为创建版本号 - DELETE
当前的系统版本号作为删除版本号 - UPDATE
相当于先DELETE, 在INSERT
五、快照读和当前读
- 快照读:MVCC读取的是快照中的数据,可以减少加锁带来的开销。
- 当前读:读的是最新数据,需要加锁。
六、Next-key Lock 结合MVCC解决幻读问题
- Next-key Lock是Record Lock和Gap Lock的结合。
2.1 Record Lock:锁定一个记录的索引,而不是记录本身。
2.2 Gap Lock:锁定索引之间的空隙,但不包含索引本身。
网友评论