MVCC是什么
MVCC就是用同一份数据临时保留多版本的方式的方式,实现并发控制。,快照读可以使普通的SELECT 读取数据时不用对表数据进行加锁,从而解决了因为对数据库表的加锁而导致的两个如下问题
- 解决了因加锁导致的修改数据时无法对数据读取问题;
- 解决了因加锁导致读取数据时无法对数据进行修改的问题;
MVCC的实现
InnoDB中使用版本链和ReadView实现MVCC。
隐藏列
DB_TRX_ID(表示最近修改该行数据的事务ID)列,DB_ROLL_PTR(指向该行回滚段的指针)列。
版本链
通过DATA_ROLL_PTR,可以读取历史版本数据。
历史版本数据是在undolog
ReadView
ReadView记录的属性
- 最小活动事务ID
- 最大活动事务ID
- 活动事务ID集合
- 当前事务ID。
判断是否可读
- 小于最小活动事务ID,可读。
- 大于最大活动事务ID,可读。
- 之间,在集合中,不可读,不在集合中,可读。
ReadView生成时机
- READ COMMITTED —— 每次读取数据前都生成一个ReadView。
- REPEATABLE READ —— 在第一次读取数据时生成一个ReadView。