MVCC--多版本并发控制机制(Multi-Version Concurrency Control)
Mysql的MVCC指多版本并发控制,Myql在读已提交和可重复读隔离级别下都实现了MVCC机制。保证了mysql在RC和RR事务隔离级别下读取数据的隔离性。
MVCC由三部分组成实现:
undo日志:回滚日志,mysql每修改记录一次,无论是否提交均会按修改时间顺序把记录记在一个日志文件中,这个文件称为undo日志。
记录版本链:对于Innodb引擎的表中有三个隐藏字段,主键、操作事务id、回滚指针。如果表中没有可选的主键,那么会自动插入一个6B的主键。操作事务Id记录操作这条记录的事务Id。回滚指针指向该记录的上一个版本。这个记录共同构成了记录版本链表。undo日志存放的内容就是记录版本链。
read-view: 一致性视图,它记录的mysl当前的事务执行情况。主要有4个参数组成。
MVCC的工作流程
1. 开启事务,什么都没做。
2. 执行第一个查询语句时生成read view视图,此时会生成一个16位的假事务Id。
3. 执行第一个加锁的操作如增删改、当前读操作都会生成真正的事务Id,并获取最新的readview视图。
4. 再执行一次不加锁的查询,能否获取到最新的readview视图与事务隔离级别有关。
4. 以当前事务Id、readview视图与记录的事务Id做对比,得出可查看的记录。
RC和RR隔离级别下MVCC的区别:
1. RC隔离级别下每次查询均会生成新的readview视图,所以它能看所有提交的记录。
2. RR隔离级别下只有第一次查询会生成readview视图,后面所有查询共用之前的readview视图。所以它读不到第一次查询后提交的数据。