MVCC多版本并发控制实现原理
请详细解释MySQL InnoDB中MVCC(Multi-Version Concurrency Control)的实现原理。Undo Log、ReadView、DB_TRX_ID等概念如何配合实现一致性非锁定读?
回答
屠龙少年
MVCC核心原理: MVCC通过数据行的多个版本来实现并发控制,使读操作不阻塞写操作,写操作不阻塞读操作。
三大隐藏字段(每行记录都有):
- DB_TRX_ID:最后修改该行的事务ID
- DB_ROLL_PTR:指向Undo Log中该行旧版本的指针(回滚指针)
- DB_ROW_ID:隐式自增ID(无主键时使用)
Undo Log版本链:
- 每次更新操作,旧版本数据被保存到Undo Log中
- 多个旧版本通过DB_ROLL_PTR连接成版本链
- 最新版本在聚簇索引中,旧版本在Undo Log中
ReadView可见性算法:
- trx_ids:当前活跃的读写事务ID列表(未提交)
- low_limit_id:最大事务ID+1(下一个待分配ID)
- up_limit_id:trx_ids中最小事务ID
- creator_trx_id:创建该ReadView的事务ID
可见性判断:
trx_id == creator_trx_id→ 可见(自己改的)trx_id < up_limit_id→ 可见(已提交)trx_id >= low_limit_id→ 不可见(未来事务)trx_id in trx_ids→ 不可见(未提交的活跃事务)- 否则 → 可见(已提交)
当前事务从版本链头部开始遍历,找到第一个可见版本。