事务基础
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
失败 ROLLBACK 靠 undo 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 链恢复旧值。
/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 生产。回答时使用「场景 → 方案 → 结果 → 反思」四段式,体现工程成熟度。