面试题:MySQL 中的 MVCC 是什么?

MVCC(Multi-Version Concurrency Control,多版本并发控制) 是 MySQL 中 InnoDB 存储引擎用于实现高并发事务处理的核心机制之一。它通过保存数据的多个版本来避免读写操作之间的锁冲突,从而提高并发性能和数据一致性。


MVCC 的核心思想

MVCC 的核心思想是为每个事务提供一个数据的“一致性视图”,使得事务在读取数据时不需要加锁,同时保证事务之间不会相互干扰。具体来说:

  • 每个事务在启动时会看到一个“快照”(Snapshot),这个快照是基于事务开始时的数据状态。
  • 写操作会创建数据的新版本,而不是直接覆盖旧数据。
  • 读操作会根据事务的快照读取相应的数据版本,而不是直接读取最新数据。

MVCC 的实现机制

1. 版本链

  • 每行数据在 InnoDB 中都有一个隐藏的 事务 ID(Transaction ID) 和 回滚指针(Rollback Pointer)
  • 当事务修改数据时,会创建该数据的新版本,并将旧版本通过回滚指针链接起来,形成一个版本链。
  • 读操作会根据事务的快照选择合适的版本。

2. Read View(一致性视图)

  • 每个事务在启动时会创建一个 Read View,用于决定哪些数据版本对当前事务可见。
  • Read View 包含以下信息:
    • 当前活跃事务的 ID 列表(即未提交的事务)。
    • 最小活跃事务 ID(up_limit_id)。
    • 下一个即将分配的事务 ID(low_limit_id)。
  • 通过 Read View,事务可以判断数据版本是否对当前事务可见。

3. 可见性判断

  • 对于每行数据的版本,MVCC 会根据以下规则判断是否对当前事务可见:
    1. 如果数据版本的事务 ID 小于当前事务的 up_limit_id,且不在活跃事务列表中,则该版本可见。
    2. 如果数据版本的事务 ID 大于或等于当前事务的 low_limit_id,则该版本不可见。
    3. 如果数据版本的事务 ID 在活跃事务列表中,则该版本不可见。
    4. 如果数据版本的事务 ID 等于当前事务的 ID,则该版本可见。

4. Undo Log(回滚日志)

  • MVCC 依赖 Undo Log 来存储数据的旧版本。
  • 当事务需要读取旧版本数据时,可以通过 Undo Log 找到相应的版本。

MVCC 的优点

  1. 高并发性能
    • 读操作不需要加锁,避免了读写冲突。
    • 写操作只锁定需要修改的行,而不是整个表。
  2. 一致性视图
    • 每个事务看到的数据是一致的,避免了脏读、不可重复读等问题。
  3. 支持高隔离级别
    • MVCC 是实现 可重复读(Repeatable Read) 和 读已提交(Read Committed) 隔离级别的关键技术。
  4. 高效的事务回滚
    • 通过 Undo Log 可以快速回滚事务,恢复数据到之前的状态。

MVCC 的局限性

  1. 存储开销
    • 需要存储数据的多个版本,增加了存储空间的开销。
  2. 清理旧版本
    • 需要定期清理不再需要的旧版本数据(通过 Purge 机制)。
  3. 写冲突
    • 如果多个事务同时修改同一行数据,仍然需要加锁来避免写冲突。

MVCC 与隔离级别

  • 读未提交(Read Uncommitted)
    • 不使用 MVCC,直接读取最新数据,可能读到未提交的数据。
  • 读已提交(Read Committed)
    • 使用 MVCC,每次读取时都会生成一个新的 Read View,确保读到已提交的数据。
  • 可重复读(Repeatable Read)
    • 使用 MVCC,事务启动时生成一个 Read View,事务内多次读取的数据一致。
  • 串行化(Serializable)
    • 不使用 MVCC,通过加锁实现完全串行化执行。

总结

MVCC 是 MySQL 中实现高并发事务处理的核心机制,通过保存数据的多个版本和一致性视图,避免了读写冲突,提高了并发性能和数据一致性。它是支持 可重复读 和 读已提交 隔离级别的关键技术,但也带来了存储开销和旧版本清理的挑战。

THE END
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容