一文详解MVCC的执行原理

 更新时间:2023年12月29日 08:22:00   作者:Java中文社群  
MVCC是一种并发控制机制,用于解决数据库并发访问中,数据一致性问题,它通过在读写操作期间保存多个数据版本,以提供并发事务间的隔离性,本文将和大家简单聊聊MVCC的执行原理,需要的朋友可以参考下

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 主要是依靠以下两部分实现的:

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

Undo Log 链

我们知道 Undo Log 主要是用于数据库中事务回滚的,但在 MVCC 机制中也发挥着重要的作用,那什么是 Undo Log 链呢?

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

Read View

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

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

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

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

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

判断方法

判断方法是根据 Read View 中的 4 个重要字段,先去 Undo Log 中最新的数据行进行比对,如果满足下面 Read View 的判断条件,则返回当前行的数据,如果不满足则继续查找 Undo Log 的下一行数据,直到找到满足的条件的数据为止,如果查询完没有满足条件的数据,则返回 NULL。

判断规则

  • trx_id==creator_trx_id:先将 Undo Log 最新数据行中的 trx_id 和 ReadView 中的 creator_trx_id 进行对比,如果他们两个值相同,则说明是在同一个事务中执行,那么直接返回当前 Undo Log 的数据行即可,如果不相等,则继续下面流程。
  • trx_id<min_trx_id:如果 trx_id 小于 min_trx_id,则说明在执行查询时,其他事务已经提交此行数据了,那么直接返回此行数据即可,如果大于等于,则继续下面流程。
  • trx_id>max_trx_id:如果 trx_id 如果大于等于 max_trx_id,则说明该行数据比当前操作执行的晚,当前行数据不可见,继续执行后续流程。
  • min_trx_id<=trx_id<max_trx_id:trx_id 在 min_trx_id 和 max_trx_id 之间还分为以下两种情况:

    trx_id 在 m_ids 中:说明事务尚未执行完,该行数据不可被访问。

    trx_id 未在 m_ids 中:说明事务已经执行完,可以返回该行数据。

以上判断规则从 Undo Log 最新的行数据,逐行对比,直到找到匹配的数据,否则查询完未匹配上,则返回 NULL。

小结

MVCC 的实现主要依赖读视图 Read View 和 Undo Log 链,通过 Read View 中的 4 个字段,判断要读取 Undo Log 中数据,从而解决了数据库并发访问中,数据一致性的问题。

MVCC 主要应用于 InnoDB 引擎中的 RC 事务隔离级别和 RR 隔离级别,其中 RC 隔离级别每次快照读都会生成一个新的 Read View,而 RR 隔离级别只在第一次快照读时生成 Read View,之后会复用 Read View,从而解决了(部分)幻读问题。

以上就是一文详解MVCC的执行原理的详细内容,更多关于MVCC执行原理的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot+SseEmitter和Vue3+EventSource实现实时数据推送

    SpringBoot+SseEmitter和Vue3+EventSource实现实时数据推送

    本文主要介绍了SpringBoot+SseEmitter和Vue3+EventSource实现实时数据推送,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • springboot @RequestBody 接收字符串实例

    springboot @RequestBody 接收字符串实例

    这篇文章主要介绍了springboot @RequestBody 接收字符串实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java设计模式之备忘录模式详解

    Java设计模式之备忘录模式详解

    这篇文章主要介绍了Java设计模式之备忘录模式详解,备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态,需要的朋友可以参考下
    2023-12-12
  • Java使用JXLS导出Excel详解

    Java使用JXLS导出Excel详解

    jxls是一个轻量级的Java库,用于基于模板的Excel报表生成,这篇文章主要为大家介绍了Java如何使用JXLS导出Excel,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • JavaWeb实现表单提交的示例详解

    JavaWeb实现表单提交的示例详解

    这篇文章主要介绍了如何利用JavaWeb实现表单提交功能,文中的示例代码讲解详细,对我们学习JavaWeb有一定帮助,感兴趣的可以了解一下
    2022-03-03
  • Mybatis-Plus使用updateById()、update()将字段更新为null

    Mybatis-Plus使用updateById()、update()将字段更新为null

    本文主要介绍了Mybatis-Plus使用updateById()、update()将字段更新为null,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Spring注入Map集合实现策略模式详解

    Spring注入Map集合实现策略模式详解

    这篇文章主要介绍了Spring注入Map集合实现策略模式详解,Spring提供通过@Resource注解将相同类型的对象注入到Map集合,并将对象的名字作为key,对象作为value封装进入Map,需要的朋友可以参考下
    2023-11-11
  • MyBatisPlus PaginationInterceptor分页插件的使用详解

    MyBatisPlus PaginationInterceptor分页插件的使用详解

    这篇文章主要介绍了MyBatisPlus PaginationInterceptor分页插件的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java编程泛型限定代码分享

    Java编程泛型限定代码分享

    这篇文章主要介绍了Java编程泛型限定的相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot项目中访问HTML页面的三种方法

    SpringBoot项目中访问HTML页面的三种方法

    这篇文章主要介绍了SpringBoot项目中访问HTML页面的三种方法,文中通过代码示例和图文结合的方式讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07

最新评论