【MySQL】MVCC多版本并发控制

2024-03-25 1316阅读

温馨提示:这篇文章已超过398天没有更新,请注意相关的内容是否还可用!

MVCC(Multi-Version Concurrency Control)

多版本并发控制,用于解决数据库并发访问中,数据一致性问题。它通过在读写操作期间保存多个数据版本,以提供并发事务间的隔离性,从而避免了传统的锁机制所带来的资源争用和阻塞问题。

 一致性问题:并发事务执行时,应该看到那些数据和不应该看到那些数据。

在 MVCC 机制中,每个事务的读操作都能看到事务开始之前的一致性数据快照,而不受其他并发事务的修改的影响。核心思想是通过创建多个数据版本,保持事务的一致性和隔离性。

使用 MVCC 机制解决了可重复读(RR)隔离级别中,部分幻读问题,但又没把全部幻读问题都解决。

  • MVCC 解决了 RR 隔离级别中,快照读的幻读问题。多次查询快照读时,因为 RR 级别是复用 Read View(读视图),所以没有幻读问题。
  • 但 MVCC 解决不了 RR 隔离级别中,如果遇到快照读和当前读(读取当前最新的数据)中间发生过添加操作,那么 Read View 不能复用,就出现了幻读的问题。

    快照读和当前读

    快照读:是指在一个事务中,读取的数据版本是在事务开始时已经存在的数据版本,而不是最新的数据版本。这种读取方式提供了事务在执行期间看到的数据视图的一致性,select 查询就是快照读。

    当前读:是指在事务中读取最新的数据版本,以下几种操作都是当前读:

    • select ... for update;
    • select ... lock in share mode;
    • insert ...
    • update ...
    • delete ...

      MVCC 实现原理

      MVCC 主要是依靠以下两部分实现的:

      1. Undo Log 链
      2. Read View(读视图或者叫一致性视图)

      Undo Log 链是指在每个数据对象上维护的 Undo Log 记录链表。每张表都会有与之相对应的 Undo Log 链,用于记录修改前的数据信息(以方便数据进行回滚)。

      【MySQL】MVCC多版本并发控制

      Read View

      Read View(读视图)用于管理事务之间数据可见性的一种机制。Read View 在特定时刻为事务创建的一个快照,该快照包含了在该时刻所有未提交事务的事务标识符,以及其他一些辅助信息。

      在 Read View 中包含了以下 4 个主要的字段:

      1. m_ids:当前活跃的事务编号集合。
      2. min_trx_id:最小活跃事务编号。
      3. max_trx_id:预分配事务编号,当前最大事务编号+1。
      4. creator_trx_id:ReadView 创建者的事务编号。

      RC (读已提交)级别中,每次快照读都会生成一个全新的 Read View,而 RR (可重复读)级别中同一个事务会复用一个 Read View。

      有了 Read View 和 Undo Log 链之后,并发事务在查询时就知道要读取那些数据了。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]