Yihui’s Blog

MySQL 中的 MVCC 是什么?

日期:2026-07-11
难度:困难
标签:#面试 #MySQL #InnoDB #MVCC

一句话答案

MVCC(多版本并发控制)让 InnoDB 的一致性读通过版本链和 Read View 读取“对自己可见”的历史版本,从而读写多数情况下不互相阻塞。

面试口语版

InnoDB 的每条聚簇索引记录有隐藏的事务 ID 和回滚指针;更新时会把旧值写进 undo log,形成版本链。普通 SELECT 会生成或使用 Read View,其中包含活跃事务边界。它沿版本链判断每个版本的事务 ID 是否可见,找到符合快照的版本返回。可重复读下,同一事务通常复用首次一致性读创建的 Read View;读已提交下每次一致性读重新创建,所以能看到已提交的新版本。MVCC 解决的是快照读的读写并发,写写冲突和锁定读仍依赖锁。

原理拆解

flowchart TD
  R[聚簇索引当前记录: trx_id] --> U[roll_pointer]
  U --> V1[undo 中旧版本]
  V1 --> V2[更早版本]
  Q[一致性读] --> RV[Read View 可见性判断]
  RV --> R
  RV --> V1

关键细节

  • 版本链依托 undo log;隐藏字段主要是 DB_TRX_ID、DB_ROLL_PTR,无显式主键时还可能有 DB_ROW_ID。
  • 当前读如 SELECT ... FOR UPDATE、UPDATE 读取最新版本并加锁,不是快照读。
  • MVCC 不等于没有锁;唯一性检查、更新、范围锁定仍需锁机制。

面试官追问

  1. Read View 中的 m_ids、min_trx_id、max_trx_id 如何判断可见性?
  2. RC 和 RR 的 Read View 创建时机有何不同?
  3. 为什么长事务会阻碍 purge?

学习清单

  • 画出“当前记录—undo 版本链—Read View”的关系。
  • 记住快照读与当前读的边界。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文