当前位置: 首页 > news >正文

一篇文章带你了解 :MySQL MVCC

很多一提到 MVCC 就会说“版本链”,但具体版本链长什么样、怎么判断哪个版本对自己可见,往往说不清楚。其实 MVCC 的本质就是通过“版本链”来控制并发事务访问同一个记录时的行为。


一、 MVCC 的“底层装备”:隐藏列与 Undo Log

要实现多版本,数据库必须得记录下数据的“前世今生”。在 InnoDB 中,每行数据后面其实都偷偷藏了两个关键的隐藏列:

  • trx_id:记录最后一次修改该行数据的事务 ID。每次事务对某条聚簇索引记录进行修改时,都会把自己的事务 ID 赋值给这个字段。

  • roll_pointer:回滚指针。它指向undo log里的旧版本数据。通过它,我们可以把一行的所有旧版本串成一个版本链,从而实现数据回溯。

当你修改数据时,旧数据不会被直接抹掉,而是进入了 undo log。这个版本链就是 MVCC 实现快照读的物理基石。


二、 核心工具:Read View(一致性视图)

光有版本链还不够,我怎么知道该读链条上的哪一个版本呢?这时候就需要Read View出马了。

Read View 就像是一个“时间快照”,记录了当前系统里有哪些事务还没提交。它包含四个核心字段:

  • m_ids:创建 Read View 时,当前系统中活跃的(即正在运行中、还没提交的)事务 ID 列表。

  • min_trx_id:活跃事务中最小的那个 ID。

  • max_trx_id:即将分配给下一个事务的 ID(也就是最大活跃 ID + 1)。

  • creator_trx_id:创建该 Read View 的事务自己的 ID。


三、 判定原理:我到底能看到谁?

当我们要查询一条数据时,会拿该数据版本里的trx_id去跟 Read View 里的这几个字段做对比。逻辑其实非常质朴,主要分为以下几种情况:

1. 确定可见的情况

  • trx_id < min_trx_id:说明生成这个版本的事务在你开启视图前就已经提交了,数据可见

  • trx_id 不在 m_ids 中:即便 ID 比较大,但如果它不在活跃列表里,说明该事务也已经提交,数据可见

  • trx_id == creator_trx_id:这就是你自己改的数据,当然可见

2. 确定不可见的情况

  • trx_id > max_trx_id:说明这个版本是在你开启视图之后才开启的事务生成的,属于“未来的数据”,不可见

  • trx_id 在 m_ids 中:说明生成这个版本的事务还没提交,读它就是“脏读”,不可见

实战逻辑:如果你发现当前版本按规则不可见,系统就会顺着roll_pointer往回找旧版本,直到找到第一个符合可见性规则的版本为止。


四、 RC 与 RR:Read View 生成时机的差异

这是面试中最爱深挖的考点:为什么 MVCC 能解决不可重复读?区别全在 Read View 的生成时机上。

  • 读提交 (Read Committed)每次执行 SELECT 语句前,都会重新生成一个新的 Read View。

    • 结果:如果在你两次查询之间有别人提交了事务,第二次查询生成的 Read View 就不再包含那个事务,你就能看到新数据。这就导致了“不可重复读”。

  • 可重复读 (Repeatable Read)只在执行第一条 SELECT 时生成一个 Read View,后面所有的查询都复用这一个。

    • 结果:即便中间有别人提交了,你用的还是最初那个 Read View,看到的依然是当初那个快照版本。这就是实现“可重复读”的秘诀。


五、 总结:MVCC 到底解决了什么?

MVCC 的出现,让数据库在并发处理上有了质的飞跃:

  • 读写并行:它通过Undo Log保存历史版本,配合Read View决定可见性,让“快照读”不需要加锁。

  • 性能提升:避免了大量的锁竞争,让数据库在高并发下依然能保持极高的吞吐量。

http://www.jsqmd.com/news/475598/

相关文章:

  • 中国电建集团勘察设计类子公司排名
  • 3步掌控散热:面向Dell G15用户的TCC-G15散热管理工具完全指南
  • 深度解析:如何利用Gemini百万级长上下文处理复杂文档?技术原理与实战指南
  • .NET 多线程任务的几种实现方式全解析
  • Matlab小电流接地系统的建模与单相故障仿真分析:设计、参数设定与运行结果
  • OpenShift CLI (oc)客户端安装以及常用命令
  • 微信多设备登录功能受限现象的技术机制解析与适配路径探索
  • 面向对象编程(上) ---4-3 对象的创建和使用
  • SCI计算复现:基于Pandat代算与手动操作,探索Al5Cu2Mg8Si6相分数梯度设计及其...
  • 突破网页文本编辑瓶颈:Chrome批量替换工具的高效工作流指南
  • MATLAB代码:风光氢的场景生成与缩减 关键词:风电;光伏;氢负荷;蒙特卡洛模拟;启发式同步...
  • HashiCorp Vault 做机密管理:必要性、困局与国产化破局之道
  • 2026论文降AI保姆级指南:亲测5款好用的降ai率工具,教你从80%降至10%
  • JetBrains IDE试用期重置全攻略:从原理到实践的完整解决方案
  • CompletableFuture:异步编程的“智能机械臂”
  • 如何通过本地处理技术构建安全的Cookie管理体系?
  • 2026权威评测:毕业论文AIGC降重免费试用盘点!
  • 高校科研管理如何提升成果转化效率?
  • 基于SpringBoot+Vue医疗设备维护平台的设计与实现
  • AI超级智能开发系列从入门到上天第一篇:Prompt工程
  • 国内访问HuggingFace最快的方法
  • 无极调速数控车床主轴箱装配图CAD图纸
  • 无向图DFS、BFS生成树,ABC251F
  • 资深测试老鸟,一篇讲清楚性能测试是什么,一文上高速...
  • 三相交流220V电压源经AC-DC-DC变换用于电镀电源
  • 横波直探头接收信号示意图](placeholder_waveform.png
  • Turnitin AI检测和知网AIGC检测有什么不同?留学生必看
  • WorkBuddy,是腾讯最近推出的一款 AI 桌面智能体
  • 七部门重磅发布AI安全治理三年行动计划!全行业合规边界划定,这些要求直接影响每一家AI企业
  • 基于用户行为的动态标签与SOP触发引擎