跳转至

MVCC 如何保证事务隔离性

一、MVCC 是什么

多版本并发控制:读操作不阻塞写,写操作不阻塞读,通过版本链实现。

二、实现要素

1. 隐藏字段

每行有: - DB_TRX_ID:最近修改的事务 ID。 - DB_ROLL_PTR:指向 undo log。

2. undo log 版本链

当前版本 → undo log 上一个版本 → 更早版本

3. ReadView

读视图,包含: - m_ids:活跃事务 ID 列表。 - min_trx_id:最小活跃 ID。 - max_trx_id:下一个要分配的 ID。 - creator_trx_id:创建 ReadView 的事务。

三、可见性判断

遍历版本链,判断每个版本是否对当前 ReadView 可见:

  • 版本 trx_id < min_trx_id:已提交,可见。
  • 版本 trx_id >= max_trx_id:ReadView 创建后才提交,不可见。
  • 版本 trx_id 在 m_ids 里:活跃事务,不可见。
  • 否则:可见。

四、隔离级别差异

级别 ReadView 时机
读未提交 直接读最新
读已提交 每次 SELECT 新建 ReadView
可重复读 第一次 SELECT 建 ReadView,复用
串行化 加锁

五、RC vs RR

  • RC:每次查都建新 ReadView,能看到其他事务新提交的。
  • RR:第一次查建 ReadView,后面复用,看不到新提交的。

六、为什么快

  • 读不加锁。
  • 读写不阻塞。
  • 提高并发。

面试一句话

MVCC = 版本链 + ReadView,读快照不加锁。