xancel的自留地
文章
技术

深入理解MySQL MVCC

2026年3月15日 2 分钟阅读 浏览 1 喜欢 0 评论 0
AI 摘要

MVCC(多版本并发控制)是InnoDB引擎实现隔离级别的核心技术,通过隐藏字段、Undo Log版本链和ReadView来解决读写冲突。其可见性判断算法依据事务ID与ReadView的匹配来决定读取哪个版本的数据。已提交读(RC)和可重复读(RR)隔离级别的本质区别在于ReadView的生成时机:RC每次查询都生成新ReadView,而RR只在第一次查询时生成并复用。

首先,什么是MVCC

MVCC 中文名多版本并发控制,它是InnoDB引擎实现隔离级别(主要是已提交读RC和可重复读RR)的核心技术

并发事务有两类冲突:读写冲突和写写冲突

  • 读写冲突:事务A在读取某一行数据,事务B同时在修改同一行数据
  • 写写冲突:两个事务同时修改同一行数据

写写冲突必须要用锁来保证串行执行,而读写冲突如果也加锁,性能就会变得很差,MVCC就是为了解决读写冲突而设计的

MVCC的三个核心点

  1. 隐藏字段: 每行记录都有两个关键隐藏列:
    • trx_id:最后一次修改该记录的事务 ID。
    • roll_pointer:回滚指针,指向该记录在 Undo Log 中的上一个版本。
  2. Undo Log 版本链: 每次修改记录时,旧版本会被存入 Undo Log,通过回滚指针串联成一个从新到旧的版本链表
  3. ReadView (一致性视图): 事务执行查询时产生的快照,包含当前系统中活跃事务(未提交) 的 ID 列表。它是判断“哪个版本对当前事务可见”的依据。

可见性判断算法(ReadView规则)

当一个事务尝试读取版本链中的某条记录时,会根据 trx_id 匹配 ReadView:

  1. 自己可见: trx_id == 当前事务ID
  2. 已提交可见: trx_id < 最小活跃事务ID(说明该版本在查询开始前已提交)。
  3. 未提交不可见: trx_id >= 预分配事务ID(说明该版本在查询开始后才产生)。
  4. 活跃中判断:trx_id 在活跃事务列表中,则不可见;若不在,说明已提交,可见。

逻辑: 如果当前版本不可见,则顺着 roll_pointer 往回找上一个版本,直到找到可见的版本为止。

已提交读RC和可重复读RR的本质区别

  • RC(提交读): 每次 SELECT 都会生成一个新的 ReadView。所以能看到其他事务最新提交的结果,存在不可重复读问题。
  • RR(可重复读): 只在第一次 SELECT 时生成 ReadView,后续查询复用同一个。所以整个事务期间看到的数据始终一致。
www.bilibili.com

10分钟带你深刻理解MySQL中的MVCC机制

参考引用
喜欢 0
评论区在赶来的路上...