来源于mysql高性能第三版:
我们通过Innodb的简化版行为来说明mvcc是如何工作的。
InnoDB的MVCC,是通过每行记录后便保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期时间(删除时间)。当然存储的并不是实际的时间值,而是系统版本号。每开始一个新的事物,系统版本号都会自动递增。事物开始时刻的系统版本号会作为事物的版本号,用来和查询到行记录的版本号进行比较。下面看一下在REPEATABLE READ隔离级别下,mvcc具体是如何操作的。
SELECT
Innodb会根据一下2个条件检查每行记录:
a. innodb只查找版本号早于当前系统版本的数据行(也就是,行的系统版本号小于或等于事物的系统版本号),这样可以确保事物读取的行,要么是在事物开始前就存在,要么是事物自身插入或者修改过。
b. 行的删除版本要么未定义,要么大于当前系统版本号。这可以确保事物读取到的行,在事物开始前未被删除。
INSERT
innodb为新插入的每一行保存当前系统版本号作为行的版本号。
DELETE
Innodb为删除的每一行保存当前系统版本号作为行删除标识。
UPDATE
innodb为插入新记录,保存当前系统版本号为行版本号,同时保存当前系统版本号为原来的行为行删除标识。
mvcc实在 repeatable read 和 read commited 两个隔离级别下工作。