MVCC
MVCC即多版本并发控制。数据库的事务型存储引擎基于提升并发性能的实现会使用MVCC。
MVCC的实现,是通过保存数据在某个时间点的快照来实现的。即是说,事务不管需要执行多长时间,其看到的数据都是一致的。
InnoDB的MVCC
InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。一个保存了行的创建时的系统版本号,一个保存行的过期(删除)时的系统版本号。每开始一个事务系统版本号都会递增,事务开始时刻的系统版本号会作为事务的版本号。
规则
- 增:记录的创建版本=当前事务版本
- 删:记录的删除版本=当前事务版本
- 改:原记录的删除版本=当前事务版本,新增记录的创建版本=当前事务版本
- 查:满足 当前事务版本>=记录的创建版本 并且 当前事务版本<记录的删除版本
举例:(隔离级别为REPEATABLE READ,以v1代表事务版本号为1)
数据 | 创建版本 | 删除版本 | |
---|---|---|---|
row1 | abc | 1 | - |
row2 | xyz | 2 | - |
事务(v1)插入row1,此时row1创建版本为1
事务(v2)插入row2,此时row2创建版本为2
事务(v3)查询row1和row2,此时满足row1和row2的创建版本小于或等于当前事务版本号,并且删除版本为空或者大于当前事务版本号,创建版本为1的row1、创建版本为2的row2作为查询结果返回
当事务(v3)查询中,事务(v4)删除了row1,并且对row2进行了修改(删除记录然后新增),则此时表结构为:
数据 | 创建版本 | 删除版本 | ||
---|---|---|---|---|
row1 | abc | 1 | 4 | (deleted) |
row2 | xyz | 2 | 4 | (deleted) |
row2 | xy | 4 | (inserted) |
这时事务(v3)的的查询结果仍然为创建版本为1的row1和创建版本为2的row2