MVCC
2017-03-17 本文已影响0人
码农也越野
多版本并发控制。可以认为MVCC是行级锁的变种,但是它在很多情况下避免了加锁操作,因此开销更低。下面以InnoDB为例:
原理
MVCC 的实现是通过保存数据在某个时间点的快照来实现的。同一时刻同一张表,不同事务看到的数据可能是不一样的。
实现方式
通过在给每行记录增加两个隐藏列,一个字段存储创建时的时间(系统版本号),一个字段存储删除时的时间(系统版本号)。每开始一个新事务,系统版本号都会自动递增。
- SELECT
InnoDB会根据以下两个条件检查每行记录:
a、 InnoDB只查找版本早于当前事务版本的数据行(也就是行的系统版本号小于或等于事务的系统版本号),这样可以保证读取时该记录是已经被创建好,已经存在的。
b、 行的删除版本要么未定义,要么大于当前事务版本号。这样可以保证该记录在查询时还未被删除。 - INSERT
为新插入的每一行保存当前的系统版本号作为行版本号。 - DELETE
InnoDB为删除的每一行保存当前系统版本号为行删除标示。 - UPDATE
InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标示。
优点:使得大多数读操作可以不用加锁,读数据简单,性能好,也能保证读到符合标准的行。
缺点:每行记录都需要额外的存储空间,而且需要做更多的检查工作,以及一些额外的维护工作。
MVCC只能在可重复读和提交读两个隔离级别下工作。因为未提交读总是读取最新的数据行,而不是符合标准的数据行。而串行化则会对所有读取的行都加锁。