NEWS DETAIL

MVCC 完整读取演示

发布时间:2026/10/23 19:47:43 · 栏目:资讯中心

尧图网络原创建站知识分享正文
一、准备数据与事务环境假设有一张account表初始数据idnamebalanceDB_TRX_IDDB_ROLL_PTR1Alice1000100NULL当前活跃事务列表[]空当前最大事务 ID100undo log 版本链按时间顺序当前行 → (NULL)二、场景一演示 MVCC 解决脏读时间线T0 ── T1 ── T2 ── T3 ── T4 ── T5 ── T6 ── T7步骤时间事务 Aid101事务 Bid102数据库状态1T0BEGIN—balance1000, TRX_ID1002T1—BEGIN同上3T2—UPDATE account SET balance2000 WHERE id1balance2000, TRX_ID102, 旧版本(1000)→undo4T3SELECT balance FROM account WHERE id1—?5T4—ROLLBACKbalance1000 恢复6T5——仅 A 看到的结果保留T3 时刻MVCC 如何挡住脏数据事务 A 第一次 SELECT生成 Read Viewm_ids活跃事务列表 [102] min_trx_id 102 max_trx_id 103 creator_trx_id 101自己可见性判定读取最新行balance2000, DB_TRX_ID102判定102 ∈ m_ids活跃中未提交→不可见沿DB_ROLL_PTR回溯到 undo logbalance1000, DB_TRX_ID100判定100 min_trx_id(102) →可见返回balance 1000结果A 读到 1000未被脏数据 2000 影响。T4 时刻 B 回滚后A 看到的 1000 仍然是真实值 →脏读被消除。三、场景二演示 MVCC 解决不可重复读时间线T0 ── T1 ── T2 ── T3 ── T4 ── T5 ── T6步骤时间事务 Aid101事务 Bid102数据库状态1T0BEGIN—balance1000, TRX_ID1002T1SELECT balance→ ?—A 第一次 SELECT3T2—BEGIN—4T3—UPDATE ... SET balance2000并 COMMITbalance2000, TRX_ID102, undo 保存 10005T4SELECT balance→ ?—A 第二次 SELECT6T5COMMIT——T1 时刻建立 Read ViewRR 级别下的快照m_ids [101] ← 仅 A 自己活跃 min_trx_id 101 max_trx_id 102 creator_trx_id 101可见性判定当前行TRX_ID100100 min_trx_id(101) →可见返回balance 1000✓T4 时刻复用同一个 Read ViewRR 的关键m_ids [101] ← 仍是 A 启动时的视图未刷新 min_trx_id 101 max_trx_id 102可见性判定当前最新行balance2000, DB_TRX_ID102判定102 ∈ m_ids(101)不在但 102 ≥ max_trx_id(102) 且 102 ≠ creator_trx_id →不可见回溯 undo logbalance1000, DB_TRX_ID100判定100 min_trx_id(101) →可见返回balance 1000✓与 T1 一致结果A 两次 SELECT 都读到 1000B 在中间提交了 2000 也没影响 →不可重复读被消除。四、对比RC 级别下同样的操作会发生什么如果把隔离级别降到Read Committed步骤RC 下的 Read View读取结果T1 第一次 SELECTm_ids[101]1000T3 B 提交—DB_TRX_ID102, balance2000T4 第二次 SELECT新建m_ids[]当前 102 不在活跃列表 →可见返回2000→RC 级别下不可重复读仍然存在这就是为什么 MVCC 在 RR 级别才能完整解决不可重复读。五、一张图看清整个流程┌──────────────────────────────┐ 事务 A 启动 ───► │ 建立 Read View快照固化 │ └──────────────────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ 任何时刻 SELECT 任何时刻 SELECT │ │ 读最新行DB_TRX_ID102(B已提交) 读最新行DB_TRX_ID102(B已提交) │ │ 判定不可见不在A启动时 判定仍不可见RR复用视图 的活跃列表中但属于后续 │ │ 沿 undo 链回溯 沿 undo 链回溯 │ │ └───────────────┬───────────────┘ ▼ 返回 1000同一个旧版本六、核心要点回顾机制作用undo log 版本链保存历史快照让读旧值成为可能Read View定义哪些版本对当前事务可见的判定规则快照固化RR同一事务内 Read View 不变 → 同一行读到相同值屏蔽未提交已提交的事务 ID 必须在快照前出现 → 挡住脏数据一句话MVCC 通过版本链 读视图两套机制把脏读和不可重复读问题转化为按版本号查快照的纯读取问题从根本上绕开了读时要锁、写时要等的性能损耗。如果你想要的话我可以再演示MVCC 与幻读Phantom Read的关系——这是它没能完全解决的场景以及 InnoDB 是如何用Next-Key Lock补位的。
✦

本文为尧图网络原创建站知识分享。想针对自身行业获取定制化建站方案?欢迎咨询,资深顾问免费为你出思路。

RELATED

相关 资讯推荐

MORE

更多 新鲜资讯

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析
2026/10/21 11:24:40

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析

1. 项目概述:从零开始,用JMeter搞定HTTP性能测试 刚接触性能测试的新手,或者是从功能测试转过来的朋友,一听到“压测”两个字,心里可能就有点发怵。工具那么多,概念那么杂,从哪儿下手呢&#xf…

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统
2026/10/22 18:46:31

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统

最近我用TypeScript写了一个运行在浏览器里的Web操作系统 Earendel(目前已知的距离地球最遥远的恒星)。开发它的初衷主要是为了Linux和操作系统课程的教学。市面上绝大多数Web OS项目,要么只是做了一个长得像Windows/macOS的网页UI拼盘&#…

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]
2026/10/19 6:46:54

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形🚀 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: http…

从零制作同人动画:技术路线、流程与实战避坑指南
2026/10/23 3:09:10

从零制作同人动画:技术路线、流程与实战避坑指南

1. 先搞清楚这个“粉丝动画”到底是什么,以及它能解决什么问题看到“五条悟VS宿傩/咒术回战粉丝动画”这个标题,很多人的第一反应可能是去找一个现成的视频。但如果你是一个想自己动手创作、或者想了解这类作品背后技术流程的创作者,这个标题…

闭源降价80%,开源却在涨价:AI定价的交叉路口
2026/10/23 15:38:44

闭源降价80%,开源却在涨价:AI定价的交叉路口

8月6日,两条价格曲线悄然交汇。 一条向下:OpenAI把GPT-5.6 Luna的输出价格从6美元砍到1.2美元/百万Token,降幅80%。另一条向上:同一天,DeepSeek公告全线涨价,措辞是"涨幅较大",非试探…

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买
2026/10/23 10:16:26

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买经常有工厂朋友拿着网上的"三防平板十大品牌排行榜"来问我:到底选哪个?说实话排行榜看看就行,真正选型得看你产线什么场景。今天挑五个在产线数字化里用得比较多的品牌—…

看完这篇,还想了解更多?

预约尧图网络顾问一对一沟通,针对你的行业与现状给出建站建议,全程免费。

免费咨询