定义
MVCC(multi-version concurrent control)是指多版本并发控制,是一种并发控制方法,在数据库管理系统中,实现对数据库的并发访问。
作用
Mysql的InnoDB引擎中实现的MVCC主要是为了提高数据库的并发性能,在不加锁的情况下处理读-写冲突。
原理
概述
MVCC的实现原理主要包括三个方面,分别是:
记录中的三个隐式字段,undo log,read view。
隐式字段
InnoDB中每行记录除了我们自定义的字段,还有三个隐式字段:TRX_ID,ROLL_PTR,ROW_ID。
TRX_ID:创建这条记录或者最后一次修改这条记录的事务id;
ROLL_PTR:回滚指针,指向这条记录的上一个版本;
ROW_ID:隐含的主键,如果数据库表没有主键,则用ROW_ID生成一个自增主键。
undo log
undo log是回滚日志,记录行数据的历史版本
read view
read view是事务进行快照读的时候产生的读视图,主要是用来做可见性判断的。
read view有三个主要字段:
trx_list:用来记录read view生成时刻系统正处于活跃状态的事务id;
up_limit_id:记录trx_list中的最小事务id;
low_limit_id:记录read view生成时系统尚未分配的下一个事务id,也就是当前最大事务id+1.
可见性规则如下:
如果TRX_ID等于创建read view事务的id,代表是本事务做出的修改,则当前事务能看到TRX_ID所在的记录;
如果TRX_ID < up_limit_id,代表TRX_ID所在的记录在Read View生成之前就提交了,则当前事务能看到TRX_ID所在的记录;
如果TRX_ID >= low_limit_id,代表TRX_ID所在的记录在Read View生成后才提交的,那么对于当前事务不可见;
如果up_limit_id <= TRX_ID < low_limit_id,再判断TRX_ID是否在活跃事务id中,如果在,则代表在Read View生成时刻,这个事务还是活跃状态,还没有commit,其修改的数据,当前事务不可见,如果不在,则说明这个事务在Read View生成之前就已经commit,那么其修改的结果对于当前事务是可见的。
InnoDB在RC、RR级别下生成read view的区别
RC级别下,一个事务中每次快照读都会生成一个read view;
RR级别下,一个事务只在第一次快照读的时候生成read view。