0 概述
mvcc(multiversion concurrency control )多版本并发控制;用于多事务环境下,对数据读写在不加读写锁的情况下实现互不干扰,从而实现数据库的隔离性。
1 事务特性
事务四种特性如下图所示:undo log是回滚日志,提供回滚操作。
2 mvcc 实现原理
mvcc 在mysql Innodb 得到支持,Innodb为每行记录都增加了三个字段。
- DB_TRX_ID,占用6个字节,记录插入或更新该行的最后一个事务的事务 ID
- DB_ROLL_PTR ,占用7个字节,指向改行对应的 undo log 的指针
- DB_ROW_ID ,占用6个字节,AUTO_INCREMENT 的主键 ID。如果InnoDB自动生成聚集索引,则该索引包含行ID值。否则,DB_ROW_ID列不会出现在任何索引中。
当前活跃的事务链表 (执行begin,但是还没有commit的事务)保存到一个叫trx_sys的事务链表中,当事务提交成功后,事务链表就会移除该事务。
当前事务能读取到哪个历史版本?
Read View是一个事务开启时,会根据上面的事务链表构造出来的。事务链接,这个数据结构中存储了当前Read View中最大的ID及最小的ID。当前事务可以根据查询到事务链表事务ID进行匹配是否能看见该记录,从而实现数据库的事务隔离。
- 如果trans_id<low_limit_id 表名这个版本是已经提交事务生成的,所以是可见的。
- 如果trans_id>low_up_id 表名这个版本由将来未开始事务生成,所以是不可见的。
-low_up_id< trans_id<up_limit_id 如果row 事务id 在事务链表中,不可见。 如果row 事务id 不在事务链表中,可见
参考文献
[1]https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html
[2]https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_mvcc