温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MVCC如何支持高并发

发布时间:2026-09-09 20:02:57 来源:亿速云 阅读:86 作者:小樊 栏目:数据库

MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库(如 MySQL InnoDB、PostgreSQL、Oracle 等)用来在保证数据一致性的前提下,提高并发性能的核心机制。

下面从“为什么能支持高并发”以及“它是怎么做到的”两个角度说明。


一、MVCC 为什么能支持高并发?

传统锁机制的问题:

  • 读锁和写锁互斥
  • 写操作会阻塞读,读操作也会阻塞写
  • 并发一高,锁等待严重,吞吐量下降

MVCC 的核心思想是:

读写不互斥,读历史版本,写新版本

✅ 读不阻塞写
✅ 写不阻塞读
✅ 不同事务看到不同“时间点的数据”

因此:

  • 大量并发读
  • 并发读写
  • 都不会互相阻塞

二、MVCC 是如何实现的?(以 InnoDB 为例)

1️⃣ 每行数据都有“隐藏版本信息”

InnoDB 每行记录包含:

  • DB_TRX_ID:最后修改该行的事务 ID
  • DB_ROLL_PTR:回滚指针(指向 undo log 中的旧版本)
当前行 → undo log(旧版本1) → undo log(旧版本2) → ...

2️⃣ 事务有“一致性视图(Read View)”

事务启动时(或语句执行时)会生成一个 Read View,包含:

  • 当前活跃事务 ID 列表
  • 当前最大事务 ID

事务只“看得到”:

  • 已提交的事务修改
  • 自己做的修改

3️⃣ 读操作:找“可见版本”

当读一行数据时:

  1. 从最新版本开始
  2. 判断 DB_TRX_ID 是否对当前事务可见
  3. 不可见 → 沿 roll_ptr 找旧版本
  4. 直到找到可见版本

✅ 读的是快照
❌ 不需要加锁


4️⃣ 写操作:写新版本

  • 不直接覆盖旧数据
  • 新版本写入,旧版本保留在 undo log
  • 其他事务仍可读旧版本

三、MVCC 支持的并发场景

✅ 场景 1:读多写少(最常见)

  • 大量 SELECT 并发
  • 写操作不影响读
  • 性能极高

✅ 场景 2:读写混合

  • 读旧版本
  • 写新版本
  • 互不阻塞

✅ 场景 3:长事务分析

  • 事务开始时的一致性视图
  • 不会被后续写入影响

四、MVCC 与隔离级别的关系

隔离级别 MVCC 行为
读未提交 不使用 MVCC
读已提交(RC) 每条语句新建 Read View
可重复读(RR) 事务级 Read View(MySQL 默认)
串行化 退化为锁

五、MVCC 的代价(也要知道)

  • undo log 会变大(版本链)
  • 需要 purge 线程清理旧版本
  • 长事务可能导致版本堆积

六、一句话总结

MVCC 通过“数据多版本 + 事务快照”,让读和写互不阻塞,从而在高并发场景下显著提升数据库吞吐能力。

如果你愿意,我也可以:

  • 用一张图讲 MVCC 版本链
  • 对比 MVCC 和锁机制
  • 结合 MySQL / PostgreSQL 具体实现讲
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手