博客
关于我
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/

    你可能感兴趣的文章
    mysql 导入导出大文件
    查看>>
    MySQL 导出数据
    查看>>
    mysql 将null转代为0
    查看>>
    mysql 常用
    查看>>
    MySQL 常用列类型
    查看>>
    mysql 常用命令
    查看>>
    Mysql 常见ALTER TABLE操作
    查看>>
    MySQL 常见的 9 种优化方法
    查看>>
    MySQL 常见的开放性问题
    查看>>
    Mysql 常见错误
    查看>>
    mysql 常见问题
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
    查看>>
    MySQL 快速创建千万级测试数据
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>
    MySQL 性能优化 & 分布式
    查看>>
    MySQL 性能优化的 9 种姿势,面试再也不怕了!
    查看>>
    MySql 手动执行主从备份
    查看>>
    Mysql 批量修改四种方式效率对比(一)
    查看>>