1. MySQL MVCC 机制概念
Multi-Version Concurrency Control(多版本并发控制)。InnoDB 在不加锁的情况下,让读-写互不阻塞的核心机制。下面通过图解和动画逐层拆解。
MVCC = 隐藏字段 + Undo Log 版本链 + ReadView
2. 为什么需要 MVCC?
数据库并发场景下,多个事务同时读写同一行数据会带来三类问题。MVCC 的目标:让读操作不加锁、不阻塞写,同时避免读到脏数据。
3. 事务隔离级别
SQL 标准定义了 4 种隔离级别,解决不同程度的问题。MVCC 主要服务于 RC 和 RR 两个级别,它们都避免了脏读,区别在于是否避免不可重复读。
4. 隐藏字段:行的"身份证"
InnoDB 给每行数据加了 3 个用户看不到的隐藏字段,这是 MVCC 追踪版本的基础
5. Undo Log 版本链
每次 UPDATE/DELETE 都会把旧版本写入 Undo Log,通过 DB_ROLL_PTR 串成一条链。这条链就是 MVCC 的"时光机"。
6. ReadView:快照的"取景器
ReadView 是事务执行快照读时生成的"可见性快照",记录了"此刻哪些事务活跃、哪些已提交"。它是 MVCC 判断版本可见性的核心依据。
7. 可见性判断算法
拿到一行数据,怎么判断它的 DB_TRX_ID 对当前 ReadView 是否可见?这是 MVCC 的"判定流程"。
8. RC vs RR:ReadView 创建时机
RC (读已提交)和 RR (可重复读)的 MVCC 实现完全相同,唯一区别是 ReadView 的创建时机。这一差异决定了能否避免不可重复读。
动画展示:
MVCC 多版本并发控制机制
9. 完整实战案例带入验证
RR (可重复读)隔离级别下,事务 A 两次读取 user 表,中间事务 B 修改并提交。看 MVCC 如何保证可重复读。