MVCC 原理简述:从版本链到一致性视图,一篇讲透
面试官:“MVCC 是什么?它是如何实现可重复读的?”
你:“MVCC 是多版本并发控制,InnoDB 通过 undo log 版本链 + read view 实现。写操作生成新版本,读操作根据 read view 选择可见版本,读写不互斥,大大提高了并发性能。在可重复读级别下,事务启动时生成一致性视图,整个事务复用该视图。”
面试官:“那 read view 具体包含哪些信息?RC 和 RR 在生成 read view 上有什么区别?”
你:“……”
很多人知道 MVCC 可以解决不可重复读,但一追问底层版本链如何组织、read view 的可见性判断规则就含糊了。本文从源码角度,彻底讲透 InnoDB MVCC 的实现原理。
一、什么是 MVCC?
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种无锁并发控制技术。它允许事务在读取数据时,不加锁也能看到某个时间点的数据快照,从而避免“读-写”冲突,提升数据库的并发性能。
InnoDB 的 MVCC 主要用于实现 RC(读已提交) 和 RR(可重复读) 两种隔离级别,是 InnoDB 默认使用 RR 级别的底层支撑。
二、MVCC 依赖的三个核心组件
1. 隐藏字段
InnoDB 中,每行数据除了用户定义的列,还有三个隐藏字段:
| 隐藏字段 | 说明 |
|---|---|
DB_TRX_ID |
最后一次修改该行的事务 ID(6 字节) |
DB_ROLL_PTR |
回滚指针,指向 undo log 中该行的旧版本记录(7 字节) |
DB_ROW_ID |
行 ID,当表没有主键和唯一索引时,InnoDB 用它生成聚簇索引(6 字节) |
DB_TRX_ID和DB_ROLL_PTR是 MVCC 的关键。
2. Undo Log 版本链
当对某行数据执行 UPDATE 或 DELETE 时,InnoDB 会将该行的旧版本写入 undo log,同时更新当前行的 DB_TRX_ID 为新事务 ID,DB_ROLL_PTR 指向 undo log 中的旧版本记录。多个旧版本通过 DB_ROLL_PTR 串联起来,形成一个 版本链,从当前版本可以回溯到最早的版本。
例如,初始行:(id=1, name='A', age=10),DB_TRX_ID=100,DB_ROLL_PTR=null。
事务 101 执行 UPDATE SET age=20:
- 将旧版本
(id=1, name='A', age=10)写入 undo log,记录DB_TRX_ID=100,DB_ROLL_PTR=null。 - 更新当前行:
name='A', age=20,DB_TRX_ID=101,


526

被折叠的 条评论
为什么被折叠?



