博客
关于我
Mysql MVCC精简
阅读量:799 次
发布时间: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/

    你可能感兴趣的文章
    mysql 的存储引擎介绍
    查看>>
    MySQL 的存储引擎有哪些?为什么常用InnoDB?
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>