日期:2026-07-11
难度:困难
标签:#面试 #MySQL #MVCC #锁
一句话答案
没有 MVCC 时,要维持隔离性就得让读操作更多依赖锁:读写互相阻塞、并发和尾延迟显著变差;若少加锁,又会更容易出现脏读、不可重复读等异常。
面试口语版
如果没有多版本,读只能看当前唯一版本。为了不读到正在修改但未提交的数据,读需要等写锁,写也可能等读锁;在读多写少的业务里吞吐会迅速下降。MVCC 把“读旧的已提交版本”和“写新版本”分开,使普通读不需要加锁。没有它并不意味着数据库无法实现事务,严格两阶段锁也能保证隔离,但代价是锁竞争、死锁和锁等待会更多,尤其是报表和长查询会拖慢在线写入。
关键细节
- MVCC 主要优化读写并发,不能消除写写冲突。
- 串行化也可不依赖 MVCC 获得强隔离,但并发能力最低。
- “无 MVCC 必然脏读”不准确:加足锁可以避免,只是成本更高。
面试官追问
- 两阶段锁和 MVCC 如何配合?
- MVCC 解决了哪些冲突,没解决哪些冲突?
- 为什么长事务是 MVCC 的代价?
学习清单
- 用“并发性—空间与版本维护成本”说明 MVCC 的取舍。