Mvcc 如何解决脏读、不可重复读问题

Mvcc (多版本并发控制) 设计目的:

为了解决数据库不同隔离级别下出现的脏读、不可重复读问题


主要组成: 

undoLog 版本链

        1. update | select 操作时、将每次操作记录到 undoLog 中

        2. undolog 中记录了 roll_pointer 引用信息、通过roll_pointer 组成一条版本链

        3. 通过 undoLog 版本链记录某条数据的版本变更信息

readView 读视图

        1. 查询时会记录 undoLog 版本链的统计信息

        2. 版本链统计信息

                2.1 m_ids 当前活跃事务id (未提交事务id)

                2.2 min_trx_id 最小活跃事务id

                2.3 max_trx_id 最大活跃事务 id + 1(undoLog 版本链头事务id + 1)

                2.4 creator_trx_id 创建 readView 的事务id


查询步骤

        1. 查询时先记录readView 读视图 记录版本链的统计信息

        2. 遍历undoLog 版本链 (链头 -> 链尾)

                2.1 undoLog 版本链事务id = 当前事务 id 表示这条数据是当前事务更改的可以返回

                2.2 如果 undoLog 版本链事务id < min_trx_id 最小事务id、表示在创建readView 之前当前事务已经提交、可以被访问

                2.3 undoLog 版本链事务id > max_trx_id 最大事务id、表示当前事务是在 readView 生成后创建的不可以被访问

                2.4 undoLog 版本链事务id 在 min_trx_id 与 max_trx_id 之间、并且不在活跃事务 m_ids 中表示当前事务已经被提交、可以被访问

相关推荐

  1. Mvcc 如何解决、不可重复问题

    2024-05-11 17:40:03       31 阅读
  2. mysql 锁 事务 重复

    2024-05-11 17:40:03       67 阅读
  3. 什么是、幻、不可重复

    2024-05-11 17:40:03       38 阅读
  4. 【MySQL】,幻,不可重复

    2024-05-11 17:40:03       36 阅读
  5. 数据库的、幻、不可重复

    2024-05-11 17:40:03       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 17:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 17:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 17:40:03       82 阅读
  4. Python语言-面向对象

    2024-05-11 17:40:03       91 阅读

热门阅读

  1. 服务器白名单

    2024-05-11 17:40:03       39 阅读
  2. FFmpeg 中 -f 命令参数详解

    2024-05-11 17:40:03       32 阅读
  3. linux的firmware和hal层

    2024-05-11 17:40:03       23 阅读
  4. 双向链表队列介绍

    2024-05-11 17:40:03       31 阅读