博客
关于我
Mysql MVCC精简
阅读量:798 次
发布时间:2023-02-10

本文共 1169 字,大约阅读时间需要 3 分钟。

MVCC(Multi-Version Concurrency Control,多版本并发控制器)是一种数据库Concurrency Control(并发控制)的机制,主要用于解决多版本并发控制下的读写冲突问题。它通过版本控制和一致性视图的机制,允许多个事务在同一时间对数据库进行读写操作,而不互相阻塞,有效避免了脏读和不可重复读等问题。

MVCC的核心在于理解undo log(回滚日志)版本链和read view(一致性视图)两个关键概念。

Undo Log版本链

在数据库执行更新操作时,会生成undo log(回滚日志),并记录事务操作的相关信息。事务提交后,数据库会保留修改前的undo log日志,同时维护两个隐藏字段:trx_id(事务ID)和roll_pointer(回滚指针)。这些字段将多个undo log日志串联起来,形成一个版本链,记录事务操作的历史信息。

Read View 一致性视图

Read view是用来维护事务可见性的机制。它记录当前未提交的事务ID,并保存当前最大的事务ID。例如,如果有三个事务ID为100、200、300,其中300已经提交,那么生成的read view就是[100, 200], 300。

MVCC通过read view进行可见性分析,确定当前事务能够读取的数据。具体规则如下:

  • 如果事务ID小于当前未提交的最小事务ID(Min_id),则该事务已提交,对于当前事务来说数据是可见的。
  • 如果事务ID大于当前最大事务ID(Max_id),则该事务是在read view之后新开始的事务,对于当前事务来说是不可见的(除非该事务ID等于当前事务ID)。
  • 如果事务ID在[Min_id, Max_id]区间内,则需要进一步分析:
    • 如果事务ID在生成read view时被收集到未提交事务ID集合中,则对于当前事务是不可见的。
    • 如果事务ID不在read view收集的未提交事务ID集合中,则对于当前事务是可见的。
  • 可重复读隔离级别(RR)

    在可重复读隔离级别下,MVCC确保事务的读一致性。每次SELECT操作都会生成新的read view,确保读到的数据是其他事务已提交的版本,有效避免脏读。同时,更新操作会直接使用最新数据,并记录trx_id到undo log中,确保一致性。

    删除操作

    删除操作会在undo log中记录为特殊的版本记录。数据库在查询时会检查delete_flag标记位,如果标记位为true,则忽略该记录,避免数据混乱。

    事务ID分配

    MySQL不会在事务开始时分配事务ID,而是从第一次执行更新操作或加锁操作时开始递增分配。因此,事务ID是有序递增的。

    MVCC通过版本链和一致性视图的机制,有效管理多版本并发控制下的读写冲突,确保数据库事务的高效执行和一致性。

    转载地址:http://geffk.baihongyu.com/

    你可能感兴趣的文章
    Monitor原理
    查看>>
    MonoGame 示例项目教程
    查看>>
    mORMot Js对象解析 Json 实例
    查看>>
    Movie播放Gif,完美实现屏幕适配
    查看>>
    mppt算法详解-ChatGPT4o作答
    查看>>
    mpvue的使用(一)必要的开发环境
    查看>>
    MQ 重复消费如何解决?
    查看>>
    mqtt broker服务端
    查看>>
    MQTT v5共享订阅是怎么回事?如何使用共享订阅提高消息订阅的灵活性和可伸缩性?
    查看>>
    MQTT vs HTTP:谁更适合物联网?
    查看>>
    MQTT 保持活动计时器:让您的设备保持连接
    查看>>
    MQTT 保留消息
    查看>>
    MQTT 和 EMQX到底有啥区别?
    查看>>
    MQTT 在工控上位机中的应用
    查看>>
    MQTT 持久会话与 Clean Session 详解
    查看>>
    MQTT 通信协议详解与应用场景全解析
    查看>>
    MQTT介绍及与其他协议的比较
    查看>>
    MQTT工作笔记0007---剩余长度
    查看>>
    MQTT工作笔记0008---服务质量
    查看>>
    MQTT工作笔记0009---订阅主题和订阅确认
    查看>>