mysql中innodb引擎的mvvc
mysql中支持事务的存储引擎(比如innodb),用的并不是简单的行级锁,而是基于提升并发性能考虑,实现了多版本并发控制,即MVVC(Multi Version Concurrency Control)。
可以认为mvvc是行级锁的一个变种,它避免了加锁操作,因此开销更低。
innodb的mvvc,是通过在每行记录后面增加两个隐藏的列来实现。这两个列,一个保存行创建的版本号,一个保存行过期的版本号。每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较,对符合条件的记录进行操作。
具体操作说明:
对于select操作:
- innodb只查找创建版本号早于当前事务版本的数据行(行的系统版本号小于或等于事务的系统版本号)。
- 对于删除版本号,要求要么未定义,要么大于当前事务的版本号。这样确保事务读到的行,在事务开始前未被删除。
只有符合上面两个条件的记录,才能作为查询结果返回。
对于insert操作:
- innodb每插入一行,就会保存当前的系统版本号作为行版本号。
对于update操作:
- innodb会插入一条新记录,保存当前系统版本号作为行版本号,同时在原来的行的删除版本号位置中存入当前系统版本号作为删除标记。
对于delete操作:
- 对于删除的行保存当前系统版本号作为行删除标记。
保存这两个额外的系统版本号,使大多数读操作都不用加锁,读操作更加简单,性能也会有很大提升。缺点是每行记录都增加了额外的存储空间,需要做更多的行检查操作以及一些额外的维护操作。
mvvc只在提交读和可重复读两个隔离级别下工作,其它两个隔离级别和mvvc不兼容。(因为未提交读总是读到最新的数据行,不是符合当前事务版本的数据行,而可串行化会对所有的行都加锁)