数据库之MVCC

一、概念

MVCC (Multiversion Concurrency Control),即多版本并发控制技术。它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,而是将行锁和行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。

1. MVCC解决了什么问题

  • MVCC实现了MySQL中第三事务隔离级别,可重复读
  • 锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销。

2. MVCC的实现原理

MVCC是保存数据在某个时间点的快照实现的。不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制。、

Innodb MVCC主要是为Repeatable-Read事务隔离级别做的。在此隔离级别下,A、B客户端所示的数据相互隔离,互相更新不可见

3. MVCC的具体实现

以MySQL中InnoDB数据库引擎为例,讲述MVCC是怎样进行并发控制的。

  • InnoDB的MVCC是通过在数据库表的后面加入两个隐藏列来实现的。分别保存了这个行的创建时间,一个保存的是行的删除时间。开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.
  • 具体的演示的例子可参考博客
    https://blog.csdn.net/whoamiyang/article/details/51901888

4. MVCC在执行select、delete、 insert、 update的过程

SELECT
Innodb检查每行数据,确保他们符合两个标准:

  1. InnoDB只查找版本早于当前事务版本的数据行(也就是数据行的版本必须小于等于事务的版本),这确保当前事务读取的行都是事务之前已经存在的,或者是由当前事务创建或修改的行
  2. 行的删除操作的版本一定是未定义的或者大于当前事务的版本号,确定了当前事务开始之前,行没有被删除。

符合了以上两点则返回查询结果。

INSERT
InnoDB为每个新增行记录当前系统版本号作为创建ID。

DELETE
InnoDB为每个删除行的记录当前系统版本号作为行的删除ID。

UPDATE
InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。

二、MVCC的总结

一般我们认为MVCC有下面几个特点:
每行数据都存在一个版本,每次数据更新时都更新该版本
修改时Copy出当前版本随意修改,各个事务之间无干扰
保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)
就是每行都有版本号,保存时根据版本号决定是否成功,听起来含有乐观锁的味道,而Innodb的实现方式是:
事务以排他锁的形式修改原始数据
把修改前的数据存放于undo log,通过回滚指针与主数据关联
修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)
二者最本质的区别是,当修改数据时是否要排他锁定,

参考

https://blog.csdn.net/whoamiyang/article/details/51901888
https://www.cnblogs.com/chenpingzhao/p/5065316.html
https://blog.csdn.net/chen77716/article/details/6742128
可能的疑问
https://segmentfault.com/q/1010000002392124
更新时旧数据是否删除的答案
https://blog.csdn.net/phantomes/article/details/46425175
简短的总结
https://www.cnblogs.com/dongqingswt/p/3460440.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,361评论 2 89
  • 为了充分发挥MySQL的性能并顺利地使用,就必须理解其设计。MySQL的灵活性体现在很多方面。例如,你可以通过配置...
    李文文丶阅读 1,323评论 0 4
  • 如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为...
    Rick617阅读 3,597评论 0 6
  • 本文在学习了数据库库理论后的一个总结,以加深理解、形成知识架构和方便日后复习 本文大部分(包括文章框架、内容和图片...
    stoneyang94阅读 1,271评论 0 2

友情链接更多精彩内容