MySQL 中的 MVCC 是什么?

MySQL 中的 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种用于实现高并发读写操作的机制,它通过维护数据的多个版本来解决读写冲突,从而在保证事务隔离性的同时,减少锁的使用,提升数据库的并发性能。


MVCC 的核心原理

  1. 数据版本化

    • 每当一个事务修改数据时,InnoDB 存储引擎不会直接覆盖原始数据,而是生成一个新版本的数据,并将旧版本保留在回滚段(Undo Log)中。
    • 每个数据行会隐式添加三个字段:
      • DB_TRX_ID:记录最后修改该行的事务 ID。
      • DB_ROLL_PTR:指向回滚段中旧版本数据的指针(形成一个版本链)。
      • DB_ROW_ID:隐式自增主键(如果表没有显式主键)。
  2. 一致性视图(Read View)

    • 当事务开始时,InnoDB 会生成一个一致性视图(Read View),记录当前所有活跃事务的最小 ID(up_limit_id)和最大 ID(low_limit_id)。
    • 事务在查询数据时,会通过 Read View 判断某个数据版本是否对当前事务可见:
      • 如果数据的 DB_TRX_ID < up_limit_id(即修改该数据的事务已提交),则可见。
      • 如果 DB_TRX_ID >= low_limit_id(即修改该数据的事务是当前事务之后启动的),则不可见。
      • 如果 DB_TRX_ID[up_limit_id, low_limit_id) 之间,则需进一步判断该事务是否已提交。
  3. 事务隔离级别的实现

    • READ COMMITTED(RC):每个查询都会生成新的 Read View,因此可能看到其他事务已提交的修改。
    • REPEATABLE READ(RR):事务内所有查询共享同一个 Read View,因此多次查询结果一致(可重复读)。

MVCC 解决的核心问题

  1. 读写不阻塞

    • 写操作(如 UPDATEDELETE)会生成新版本数据,读操作无需等待写锁释放即可读取旧版本数据,从而避免读写冲突。
  2. 减少锁竞争

    • READ COMMITTEDREPEATABLE READ 隔离级别下,MVCC 大幅降低了对共享锁(S Lock)和排他锁(X Lock)的需求,提升了并发性能。
  3. 实现事务隔离性

    • 通过版本链和 Read View 机制,确保事务只能看到已提交的数据或自己修改的数据,满足不同隔离级别的要求。

MVCC 的优点

  1. 高并发性能

    • 读写操作可以并发执行,无需频繁等待锁,显著提升了数据库的吞吐量。
  2. 降低死锁风险

    • 由于减少了锁的使用,事务之间因锁竞争而死锁的概率降低。
  3. 一致性的读操作

    • REPEATABLE READ 隔离级别下,事务可以多次读取同一数据,得到一致的结果(可重复读)。

MVCC 的局限性

  1. 版本链开销

    • 频繁的更新操作会导致版本链过长,增加内存和磁盘 I/O 开销。
  2. 长事务问题

    • 长事务会长时间持有旧版本数据,导致回滚段膨胀,影响查询性能(需遍历更长的版本链)。
  3. 仅支持特定隔离级别

    • SERIALIZABLE 隔离级别下,MVCC 会退化为锁机制,性能下降。

总结

MVCC 是 MySQL InnoDB 存储引擎的核心特性之一,它通过数据版本化和一致性视图机制,在保证事务隔离性的同时,实现了高并发的读写操作。尽管 MVCC 存在一些局限性(如版本链开销和长事务问题),但在大多数场景下,它仍然是提升数据库并发性能的关键技术。

我正在程序员刷题神器面试鸭上高效准备面试,9000+ 高频面试真题、800 万字优质题解,覆盖主流编程方向,跟我一起刷原题、过面试:点击进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值