MVCC介绍
- 介绍: MVCC (Multiversion Concurrency Control),是一种基于数据多版本的并发控制技术,JDK的CopyOnWriteArrayList使用了此原理;
- 作用: 并发事务中,读不再阻塞写,提升数据库的并发性;
MVCC实现原理
核心思想: 每个写请求生成一个新版本(事务ID标识)的数据,写过程中并发的读请求依然读取旧版本的数据(数据快照/ReadView),大致如下图所示:
- RR隔离级别,整个事务期间,使用相同版本的数据快照/ReadView;
- RC隔离级别,每次查询使用最新版本的已提交数据快照/ReadView;
数据快照/ReadView
InnoDB引擎中,创建数据快照/ReadView是非常轻量级的。因为数据快照/ReadView只是记录了下生成快照时刻的事务信息:已提交的事务、未提交的事务和未开始的事务,并没有进行真正的数据复制。InnoDB读取数据快照的数据时,只需要按照一定的规则从undo.log中查找生成快照时当前事务可见的最新数据。从最新版本数据开始往前查找比对,过程如下:
- 如果当前数据的事务ID < 低水位,说明在ReadView中属于已提交事务,则数据可见;
- 如果当前数据的事务ID > 高水位,说明在ReadView中属于未开始事务,则数据不可见;
- 如果当前数据的事务ID在高低水位区间内,则要分情况判断:
a) 如果事务ID在未提交事务集合内,说明在ReadView中属于未提交事务,数据不可见;
b) 如果事务ID不在未提交事务集合内,说明在ReadView中属于已提交事务,数据可见;
参考: