MVCC(Mutil-Version Concurrency Control),中文翻译为多版本并发控制。
MVCC只在repeatable read和read committed两个隔离级别下工作。其他两个隔离级别和MVCC不兼容。因为READ UNCOMMITTED 总是读取最新版本的数据,而不是符合当前事务版本的数据快照。而SERIALIZABLE 则会对所有读取的行都加锁。
MVCC最大的优势是读取数据不需要对其加锁,读写不冲突,增加了系统并发性能。
1.Mysql的默认存储引擎InnoDB支持MVCC,这也是我们为什么要了解MVCC的原因。
2.应对高并发事务,MVCC比单纯的加行锁更有效率,开销更小。
3.MVCC既可以基于乐观锁来实现,又可以基于悲观锁来实现。
上面这种可重复读的隔离特性就是基于MVCC实现的。
InnoDB中MVCC的实现方式:每行记录有两个隐藏列:DATA_TRX_ID,DATA_ROLL_PTR。
6个字节的DATA_TRX_ID字段记录执行插入或更新该条记录的最后的事务ID。删除同样会被视为更新,将行记录更新为被删除状态。
7个字节的DATA_ROLL_PTR表示指向回滚段(rollback segment)的指针,InnoDB便是通过这个指针找到之前版本的数据,该行记录上所有旧版本,在undo log中都通过链表的形式组织。
如果该行记录没有主键,还需要一个6字节的DB_ROW_ID,随着插入行而递增。
MVCC是一个虚拟的概念,不存在MVCC的结构,MVCC是依靠隐藏列在undolog中组成版本链。