跳转至

InnoDB的MVCC实现机制

1. MVCC核心机制

InnoDB通过**多版本并发控制(MVCC)实现可重复读(Repeatable Read)隔离级别,其核心是通过**数据行版本管理**和��见性规则**,在非阻塞读(快照读)场景下保证事务一致性。

2. 数据行版本控制

  • 隐藏列:每行记录包含两个隐藏字段:
  • DB_TRX_ID:记录最后一次修改(插入/更新)该行的**事务ID**。
  • DB_ROLL_PTR:指向该行在**Undo Log**中的历史版本指针。
  • 版本链:每次更新操作会生成新版本,旧版本通过DB_ROLL_PTR链接形成版本链。

3. 操作对版本的影响

  • 插入操作
  • 新插入的行设置DB_TRX_ID为当前事务ID,DB_ROLL_PTR为空。
  • 更新操作
  • 旧版本数据被复制到Undo Log,新版本设置DB_TRX_ID为当前事务ID,DB_ROLL_PTR指向Undo Log中的旧版本。
  • 删除操作
  • 标记行记录为删除(设置DB_ROLL_PTR为删除标识),而非物理删除。

4. 可见性判断规则(Read View)

  • Read View:事务开启时生成,包含当前活跃事务ID列表(m_ids)和最小/最大事务ID(m_low_limit_idm_up_limit_id)。
  • 可见性条件
  • 插入可见:行的DB_TRX_ID < m_low_limit_id 或在m_ids列表中(即事务已提交)。
  • 删除可见:行的DB_ROLL_PTR未被标记为删除,或标记删除的事务ID < 当前事务ID。
  • 快照读:根据Read View过滤版本链,返回符合条件(对当前事务可见)的最新版本。

5. 与事务隔离级别的关系

  • 可重复读(RR):通过MVCC和Read View实现,事务全程使用同一Read View,避免幻读。
  • 读已提交(RC):每次查询生成新的Read View,可能看到其他事务已提交的数据。

6. 优缺点

  • 优点
  • 非阻塞读:读操作不加锁,提升并发性能。
  • 减少锁竞争:写操作仅锁定必要行,避免全表锁。
  • 缺点
  • 存储开销:需维护Undo Log和版本链。
  • 内存消耗:Read View需保存活跃事务列表。

7. 其他关键机制

  • Undo Log:存储旧版本数据,用于回滚和MVCC版本链。
  • 间隙锁(Gap Lock):防止幻读,锁定索引记录之间的间隙。
  • 死锁处理:通过等待图(Wait-for Graph)检测并回滚死锁事务。

总结

InnoDB的MVCC通过**版本链**、Read View**和**Undo Log,在可重复读隔离级别下实现高效并发控制。其核心是通过非阻塞读和细粒度锁优化,平衡性能与数据一致性。