直接回答:MVCC(多版本并发控制)让 InnoDB 为每行保留多个历史版本,读操作按可见性规则访问合适的旧版本,实现"读写不互斥":普通 SELECT 不加锁,靠快照读即可与并发写并行。它支撑了 RC 与 RR 两个隔离级别。
展开解析:三个组件:
- 隐藏字段:每行有 DB_TRX_ID(最近修改的事务 id)和 DB_ROLL_PTR(指向 undo log 中的旧版本)。
- undo log 版本链:每次修改把旧值写入 undo,多个版本串成链。
- ReadView:读快照,记录创建时活跃事务列表。可见性判断大致为:行的 DB_TRX_ID 小于最小活跃 id(已提交)可见;在活跃列表中(未提交)不可见,沿版本链找旧版本;等于自己可见。
RC 与 RR 的区别仅在 ReadView 生成时机:RC 每条 SELECT 生成新的,所以能看到新提交;RR 事务首次快照读时生成并复用,所以可重复读。写操作(UPDATE/DELETE/SELECT FOR UPDATE)是当前读,读最新版本并加锁,不走快照。
追问方向:undo log 的 purge 时机(长事务导致版本链膨胀)、RR 下幻读的残余场景。