文章目录
简介
MVCC,多版本并发控制协议:顾名思义就是每个记录有多个版本,从而实现以下功能:
- Innodb的MVCC能防止幻读的发生。(不是每个MVCC都可以,看MVCC怎么实现)
- 实现了多个事务并发下,读操作的非阻塞。
实现原理
数据结构
隐藏列
InnoDB
中每行数据都有两个隐藏列,一个保存了行的事务ID(DB_TRX_ID
),一个保存了行的回滚指针(DB_ROLL_PT
)。每开始一个新的事务,都会自动递增产生一个新的事务id。事务开始时刻的会把事务id放到当前事务影响的行事务id中,当查询时需要用当前事务id和每行记录的事务id进行比较。
数据的历史版本就是不同事务修改数据的过程事务id,这个过程不一定是递增或者递减的
基于undo log
的版本链
前面说到每行数据的隐藏列中包含了指向undo log
的指针,而每条undo log
也会指向更早版本的undo log
,从而形成一条版本链。
ReadView
通过隐藏列和版本链,MySQL
可以将数据恢复到指定版本;但是具体要恢复到哪个版本,则需要根据ReadView
来确定。所谓ReadView
,是指事务(记做事务A)在某一时刻给整个事务系统(trx_sys
)打快照,将所有正在活跃的事务id放到数组中,之后再进行读操作时,会将读取到的数据中的事务id与trx_sys
快照比较,从而判断数据对该ReadView
是否可见,即对事务A是否可见。
ReadView
RU(READ UNCOMMITTED)和SERIALIZABLE
对于 RU(READ UNCOMMITTED)
隔离级别下,所有事务直接读取数据库的最新值即可