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_id
、m_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,在可重复读隔离级别下实现高效并发控制。其核心是通过非阻塞读和细粒度锁优化,平衡性能与数据一致性。