Yihui’s Blog

如果 MySQL 中没有 MVCC,会有什么影响?

日期:2026-07-11
难度:困难
标签:#面试 #MySQL #MVCC #锁

一句话答案

没有 MVCC 时,要维持隔离性就得让读操作更多依赖锁:读写互相阻塞、并发和尾延迟显著变差;若少加锁,又会更容易出现脏读、不可重复读等异常。

面试口语版

如果没有多版本,读只能看当前唯一版本。为了不读到正在修改但未提交的数据,读需要等写锁,写也可能等读锁;在读多写少的业务里吞吐会迅速下降。MVCC 把“读旧的已提交版本”和“写新版本”分开,使普通读不需要加锁。没有它并不意味着数据库无法实现事务,严格两阶段锁也能保证隔离,但代价是锁竞争、死锁和锁等待会更多,尤其是报表和长查询会拖慢在线写入。

关键细节

  • MVCC 主要优化读写并发,不能消除写写冲突。
  • 串行化也可不依赖 MVCC 获得强隔离,但并发能力最低。
  • “无 MVCC 必然脏读”不准确:加足锁可以避免,只是成本更高。

面试官追问

  1. 两阶段锁和 MVCC 如何配合?
  2. MVCC 解决了哪些冲突,没解决哪些冲突?
  3. 为什么长事务是 MVCC 的代价?

学习清单

  • 用“并发性—空间与版本维护成本”说明 MVCC 的取舍。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts