什么是MVVC

MVVC是mysql的的多版本并发控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC,在事务级别为RR(可重复读)和RC(读提交)生效。

工作原理
实现原理借助3个隐藏字段、undo log、read view实现

3个隐藏字段

数据库表的引擎为innodb时,都会为每行数据添加3个隐藏字段。

DB_ROW_ID:包含一个行ID,该行ID随着插入新行而增加,如果有唯一键,这个隐藏字段不会被创建。
DATA_TRX_ID:插入或更新该行的最后一个事务的事务标识符。删除在内部被视为更新,在该更新中,行中的特殊位被设置为将其标记为已删除。
DATA_ROLL_PTR:滚动指针。innodb通过这个指针找到之前的版本的数据,该行版本的数据在undo log中是以链表形式存在的。

undo log

undo log是回滚日志,它可以保证事务的原子性,也记录了数据多个事务版本。当多个事务对同一个数据进行修改时,每开启一个事务,被操作的数据会生成一条临时数据,隐藏字段DATA_TRX_ID的值为当前事务的事务id,并将这些临时数据已链表的形式存入undo log日志中,DATA_ROLL_PTR的值指向undo log链表中具体回滚的数据。undo log是逻辑日志,和redo log一样也会写入磁盘,undo log的日志的清理由具体的线程管理。

Read view

consistent read view:一致性视图,为某一时刻事务系统(trx_sys)的快照,之后的读操作根据当前事务id与快照中事务系统状态做比较,判断数据对事务的可见性。

trx_sys状态

名称 说明

rw_trx_ids	x当前read view创建时还在运行的事务id列表
min_trx_id	最小事务id,rw_trx_ids中最小的id
max_trx_id	最大事务ID,当前系统中已经生成的最大事务ID+1,即下一个要生成的事务ID
creator_trx_id	当前事务id


数据可见性规则:

一行数据的trx_id = creator_trx_id,表示数据是由当前事务修改的,可见。

一行数据的trx_id < min_trx_id,表示数据在事务创建之前修改的,可见。

一行数据的trx_id >= max_trx_id,表示数据在事务创建之后修改的,不可见

一行数据的trx_id大于等于min_trx_id且小于max_trx_id,如果trx_id在rw_trx_ids列表中,表示该事务还未提前,不可见;否则可见。

隔离级别为read commited时每次读取数据都生成一个快照读,所以能看到其他事务已提交的数据;repeatable read是每次开启事务生成一个快照读。