MVCC

多版本并发控制(Multi-Version Concurrency Control)是InnoDB引擎实现隔离级别(可重复读)的一种具体方式。

一、版本号

  1. 系统版本号:每开启一个事务,系统版本号就会自增
  2. 事务版本号:事务创建时的系统版本号

二、隐藏列

  1. 创建版本号:创建一个数据行快照时的系统版本号
  2. 删除版本号:如果快照的删除版本号大于事务版本号,说明该快照有效;否则表示该快照已经被删除。

三、Undo日志

MVCC使用的快照保存在日志中,该日志通过回滚指针把一个数据行的所有快照连接起来。


MVCC_第1张图片
未命名文件.png

四、 实现过程

关键:开启一个事务时,该事务版本号肯定大于当前所有数据行的创建版本号

  1. SELECT
    设读取某个数据行的事务为T。
    T要读的数据行的创建版本号必须小于事务T的事务版本号,表明数据行已存在。
    T要读的数据行的删除版本必须大于T的事务版本号,表明数据行还没被某个事务删除。
  2. INSERT
    当前的系统版本号作为创建版本号
  3. DELETE
    当前的系统版本号作为删除版本号
  4. UPDATE
    相当于先DELETE, 在INSERT

五、快照读和当前读

  1. 快照读:MVCC读取的是快照中的数据,可以减少加锁带来的开销。
  2. 当前读:读的是最新数据,需要加锁。

六、Next-key Lock 结合MVCC解决幻读问题

  1. Next-key Lock是Record Lock和Gap Lock的结合。
    2.1 Record Lock:锁定一个记录的索引,而不是记录本身。
    2.2 Gap Lock:锁定索引之间的空隙,但不包含索引本身。

你可能感兴趣的:(MVCC)