MVCC 如何保证事务隔离性¶
一、MVCC 是什么¶
多版本并发控制:读操作不阻塞写,写操作不阻塞读,通过版本链实现。
二、实现要素¶
1. 隐藏字段¶
每行有: - DB_TRX_ID:最近修改的事务 ID。 - DB_ROLL_PTR:指向 undo log。
2. 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,读快照不加锁。