MVCC
MVCC
MVCC 是多版本并发控制,是行级锁的变种,但它在很多情况下避免了加锁操作,因此开销更低。读操作非阻塞,写操作只锁定必要的行。MVCC 的实现,是通过保存数据在某个时间点的快照来实现的。不管需要执行多长时间,每个事务看到的数据都是一致的。
Innodb 的 MVCC
Innodb 的 MVCC 是通过在每行记录后面保存两个隐藏的列出现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间。
可重复读隔离级别下的 MVCC 操作:
select:
Innodb 只查找早于当前事务版本的数据行,这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或修改过的。
行的删除版本要么未定义,要么大于当前事务版本号。确保事务读取到的行,在事务开始之前未被删除。
insert:Innodb 为新插入的每一行保存当前系统版本号作为行版本号
delete:Innodb 为删除的每一行保存当前系统版本号作为行删除标识
update:Innodb 为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。
MVCC 只在 REPEATABLE READ 和 READ COMMITTED 两个隔离级别下工作,其他隔离级别不兼容 MVCC,读未提交总是读取最新的数据行,序列化会对所有读取的行加锁。
优缺点:
优点:保存这两个额外的系统版本号,让读操作不用加锁,提升性能,保证只会读到符合标准的行。
缺点:每行记录都需要额外的存储空间,需要做更多的行检查工作,以及额外的维护。
好了,这就是 MVCC 的大体情况了,如果感觉不错的话,给我点个赞吧😄
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/0a37252bc0ce577a8a638b042】。文章转载请联系作者。
评论