Mvcc是什么

Mvcc我们习惯称之为多版本并发控制,也就是说,在数据库系统内,存在着同一个数据记录的多个版本。通过Mvcc可以实现非锁定读,即通过Select语句直接读取相应版本的值,避免了重复加锁的过程。

Mvcc是如何实现的

首先我们要知道Mysql具有四种隔离级别:读未提交(Read uncommitted),读已提交(Read committed),可重复读(Repeatable read)以及串行化(Serializable)。Mvcc则是在读已提交和可重复读的状态下通过一致性视图(consistent read view)实现的。一致性视图就是事务开始时当前数据状态的快照。
在读已提交(RC)的状态下,每个select语句都会开启一个新的视图,数据库也就会返回当前记录的最新值,这样就可以解释为什么在读已提交的状态下为什么事务不可重复读。
而在可重复读(RR)的状态下,视图由当前事务的第一个select语句创建,之后都用相同的视图,这也是隔离级别在可重复读的状态下事务内部可重复读的原因。 Innodb通过Undolog(Undolog会记录我们每次使用Update和Delete修改记录时的历史数据版本)实现了历史事务的视图。在我们的数据表中,除了我们所定义的列外,还有一个DATA_TRX_ID列,该列记录了最新修改该行数据的事务ID。当某个事务想要读取一行数据时,则会将自己的事务ID与DATA_TRX_ID进行对比,如果小于DATA_TRX_ID,则会通过Undolog链进行查询,然后取出数据相应的历史版本。

![undo log链](/assets/wp-content/uploads/2019/04/未命名文件-45.png)
Undolog链