关于多版本并发控制的一些内容。 主要来自于《高性能MySQL》,做笔记。
MCVV 的实现, 是通过保存数据在某个时间点的快照来实现的。 不管执行时间多长,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能不一致。
主要介绍 InnoDB 的 MVCC 实现。
InnoDB 的 MVCC 是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期时间(或者删除时间)。存储的实际不是时间,可以看做是系统版本号。
每次开启一个事务时,系统版本号会进行递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录进行比较。
在 REPEATABLE READ 隔离级别下,MCCC 操作如下:
只有符合以上两个条件才会进行返回查询的结果。
保存这两个版本号的优缺点
优点:
缺点:
MVCC 只在 REPEATABLE READ 和 READ COMMITED 这两个隔离级别下工作,其他两个隔离级别不兼容,READ UNCOMMITED 每次只读取最新的数据行,而不是符合当前事务版本的数据行,SERIALIZABLE 则会对所有读取的行进行加锁。
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/mvcc多版本并发控制