D
AI
学习工作台
8 周后端冲刺2026-05-221 分钟阅读

事务与 MVCC

ACID、ReadView、undo 链与隔离级别 RC/RR

8周冲刺week5MySQL事务MVCC记笔记标记疑惑

事务基础

START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;

失败 ROLLBACKundo log 逆向补偿。

隔离级别

| 级别 | 脏读 | 不可重复读 | 幻读 | |------|------|------------|------| | RC | 否 | 可能 | 可能 | | RR(默认) | 否 | 否 | 理论上可能,InnoDB 用 gap 锁缓解 | | Serializable | 否 | 否 | 否 |

脏读:读到未提交。不可重复读:同事务两次读同行不同。幻读:范围读出现新行。

MVCC 机制

每行隐藏 DB_TRX_ID(最后修改事务 id)、DB_ROLL_PTR 指向 undo 版本链。

ReadView 含:creator_trx_id、min_trx_id、max_trx_id、活跃 trx 列表。可见性:版本 trx_id 小于 min 可见;大于 max 不可见;在活跃列表不可见;否则可见。

RR 第一次快照后一致视图;RC 每次新快照看到已提交新值。

当前读与锁

更新、锁定读走 当前读,读最新并加 行锁/gap 锁week05-lock-concurrency)。

redo / undo 分工

  • 提交:redo 刷盘策略 innodb_flush_log_at_trx_commit、sync binlog 双 1 最强。
  • 回滚:沿 undo 链恢复旧值。
Lab:/chapters/mysql-interview/mvcc

面试追问

MySQL 默认 RR 为何业务还出现「重复读问题」?可能用了当前读、或另一个事务已提交在你 ReadView 之后(RC)。幻读间隙锁 关系。

实践

长事务危害:undo 链长、锁持有久、主从延迟。监控 information_schema.innodb_trx

下一篇:week05-lock-concurrency

实战巩固与面试表达

本篇属于 8 周冲刺 week05-transaction-mvcc 主题。复习时先闭卷回答 frontmatter 中三张 flashcard,再展开口述两个「为什么」:为什么这种方案能 work、边界失败时如何降级。与相邻章节对照:算法篇强调复杂度与模板,Go 篇强调工程默认写法,中间件篇强调线上故障案例。

动手与自检清单

用 25 分钟限时做 1 道相关练习题或画出一张架构/数据结构示意图;用 5 分钟写 STAR 片段说明你在项目里是否用过类似技术。记录 3 个面试追问及你的标准答法,存入 /zh/notebook/master-plan 笔记。若某点不熟,回到对应 /chapters 交互 Lab 重新走一遍流程,比死记卡片更有效。

易错点提醒

避免只背名词不会画图;避免只说优点不谈 trade-off(性能、一致性、运维成本至少提一项);避免把学习 Demo 说成百万 QPS 生产。回答时使用「场景 → 方案 → 结果 → 反思」四段式,体现工程成熟度。

知识卡片

问题

ACID 各字母含义?

点击翻转查看答案

答案

Atomicity 原子、Consistency 一致、Isolation 隔离、Durability 持久;redo 保持久,undo 保原子与 MVCC。

问题

RR 下 ReadView 何时创建?

点击翻转查看答案

答案

InnoDB RR:事务第一次 SELECT 创建 ReadView,之后复用;RC 每条 SELECT 新建 ReadView。

问题

快照读与当前读区别?

点击翻转查看答案

答案

快照读普通 SELECT 走 MVCC 读历史版本;当前读 SELECT FOR UPDATE/UPDATE/DELETE 读最新并加锁。