- MVCC说明
MVCC只适用于repeatable read和read commit两个隔离级别
(read uncommit总是读取最新的数据行,不符合当前事务版本的数据行)
(serializable则会对所用行加锁)
MVCC是行锁的一种变种
根据不同的存储引擎,MVCC有不同的实现,典型的有乐观并发控制和悲观并发控制
它避免了加锁操作,因此开销更低
MVCC是通过保存数据在某一时间点的快照实现的。
- InnoDB的MVCC介绍
InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现,这两列一个是保存了行的创建 时间,一个是保存了行的过期时间(或者删除时间);
存储的不是实际的时间值,而是系统的版本号(system version number)
每开始一个新事物,系统版本号会自动递增,事物开始时间的系统版本号会作物事务的版本号,用来和查询到的每行记录版本号进行比较;
select:
innodb会根据以下两个条件检索每行记录:
a.innodb只查询行版本号早于当前事物版本的数据行(也就是说行的系统版本号小于或者等于事务的系统版本号),这样保证事务读取的行要么是事务开始前已经存在的,要么是事物自身插入或者修改的。
b.行的删除标识要么未定义,要不大于当前事务版本号,这确保事务读取到的行,在事务开始前未被删除。
insert:
innodb新插入的每一行保存当前系统版本号作为行版本号
update:
innodb为插入一行新记录,保存当前系统版本号作为行版本号,同时保存系统当前系统版本号到原来的行作为行删除标识
delete:
innodb为删除的每一行保存系统当前系统版本号作为行删除标识
MVCC不足之处是会占用额外的空间,因此每行都会保存两个列版本哈