InnoDB的MVCC

来源:互联网 发布:ubuntu 17.10 pinyin 编辑:程序博客网 时间:2024/06/06 20:22

MVCC(Multi-Version Concurrent Control)通过在每一行后面保存两个隐藏的列来实现的。这两个列,一个保存了行的建时间,一个保存了行的结束时间。当然存储的并不是实际的时间值,而是系统版本号。每开启一个新的事务,系统版本号都会自动递增。事务开启时刻的系统版本号会作为事务版本号,用来和查询到的每行记录的版本号进行比较。需要注意的是,MVCC只在RR和RC两个隔离级别下工作

下面看下RR隔离级别下,MVCC具体是如何操作的:
SELECT
InnoDB会根据以下两个条件检查每条记录:
a. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于系统版本号),这样可以确保读取的数据,要么在事务开始前就存在,要么是事务自身插入或者修改过的。(这句话说明select语句不会改变行的版本号)
b. 行的删除版本要么未定义,要么大于当前事务版本号,这样可以确保当前事物读取到的行,在事务开启之前未被删除。
INSERT
InnoDB为新插入的每一行保存当前系统版本号作为行版本号。
DELETE
InnoDB为删除的每一行保存当前系统版本号作为行删除标识。
UPDATE
InnoDB为插入一行新记录保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。

保存这两个额外的系统版本号的优势在于,可以使绝大多数读操作可以不加锁,性能很好,并且可以保证只能读到符合标准的行。不足之处在于每行都需要额外的存储空间。需要做更多的行检查,以及一些额外的维护工作

MVCC还可查阅这篇文章:
http://libisthanks.blog.163.com/blog/static/23527612320141016111027592/

间隙锁请看这边文章:
http://www.jianshu.com/p/bf862c37c4c9