CodeWalk

MVCC多版本并发控制实现原理

作者:屠龙少年 · 2026-05-30 12:55

请详细解释MySQL InnoDB中MVCC(Multi-Version Concurrency Control)的实现原理。Undo Log、ReadView、DB_TRX_ID等概念如何配合实现一致性非锁定读?

回答

屠龙少年

MVCC核心原理: MVCC通过数据行的多个版本来实现并发控制,使读操作不阻塞写操作,写操作不阻塞读操作。

三大隐藏字段(每行记录都有):

  1. DB_TRX_ID:最后修改该行的事务ID
  2. DB_ROLL_PTR:指向Undo Log中该行旧版本的指针(回滚指针)
  3. 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 → 不可见(未提交的活跃事务)
  • 否则 → 可见(已提交)

当前事务从版本链头部开始遍历,找到第一个可见版本。