MVCC多版本并发控制工作原理

bridge
2022-01-23 / 0 评论 / 0 点赞 / 1,370 阅读 / 1,450 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

临时表

  • 执行增、删、改之前,先将满足条件的数据查询出来放入到临时表中
  • 将数据操作先在临时表中完成,完成过程中如果没用出现任何问题,就将数据同步(剪切)到实际的数据表中,并返回影响行数 ;完成过程中一旦出现错误,那就将临时表中满足条件的数据清掉,并返回错误码。

插入

  1. 先把要插入的数据放入临时表
  2. 将临时表中数据插入实际表中去
  3. 如果没问题,就复制一份到实际表中,并将临时表中的数据清空
  4. 如果有问题,返回错误信息,临时表清空

删除

  1. 先根据条件从原始表中查询来满足条件的数据行
  2. 将这些数据行复制一份到临时表
  3. 执行删除,如果出现错误原来的数据不动,临时表数据清空该条件的数据
  4. 如果执行成功,删除原始数据,返回影响行数

MVCC多版本并发控制

多版本并发控制(Multiversion Concurrency Control)

并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理。以达到用来避免写操作的堵塞,从而引发读操 作的并发问题。

默认两个隐藏行:数据行版本号+删除行版本号

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

MVCC不是MySQL独有的技术,Oracle、PostgreSQL及其他一些数据库系统也使用同样的技术。

原理

MVCC是通过及时保存在某些时刻的数据快照而得以实现的。

这意味着同一事务的多个实例,在同时运行时,无论每个实例运行多久,它们看到的数据视图是一致的。而同一时间,对于同一张表,不同事务看到的数据却是不同的。

下面分别以select、delete、 insert、 update语句来说明:

select

对于select语句,只有同时满足了下面两个条件的行,才能被返回:

  • 行的被修改版本号小于或者等于该事务号
  • 行的被删除版本号要么没有被定义,要么大于事务的版本号:
    • 行的删除版本号如果没有被定义,说明该行没有被删除过;
    • 如果删除版本号大于当前事务的事务号,说明该行是被该事务后面启动的事务删除的,由于是repeatable read隔离等级,后开始的事务对数据的影响不应该被先开始的事务看见,所以该行应该被返回.

insert

对新插入的行,行的更新版本被修改为该事务的事务号

delete

对于删除,innodb直接把该行的被删除版本号设置为当前的事务号,相当于标记为删除,而不是实际删除

update

在更新行的时候,innodb会把原来的行复制一份到回滚段中,并把当前的事务号作为该行的更新版本

优缺点

优点

保存这些额外记录的好处是使大多数读操作都不必申请加锁,这使都操作变得尽可能的块,因为读操作只要选取符合标准的行数据即可。

缺点

存储引擎必须为每行数据存储更多的额外数据,做更多的行检查工作,以及处理一些额外的整理操作。

MVCC对应隔离级别

  • MVCC只工作在REPEATABLE READ和READ COMMITTED两个隔离级别
  • READ UNCOMMITTED隔离级别不兼容MVCC,因为在任何情况下,该隔离级别下的查询,不读取符合当前事务版本的数据行,而读取最新版本的数据行,
  • SERIALIZABLE隔离级别也不兼容MVCC,因为该级下的读操作会对每一个返回行都进行加锁。

来源:https://blog.csdn.net/VIP099/article/details/108680941

0

评论区