MVCC(多版本并发控制)是数据库实现事务隔离级别的核心机制之一。不同隔离级别在 MVCC 下的“映射”方式,本质上是指:如何通过版本链、快照(ReadView)和锁,来限制事务能看到哪些数据版本。
下面以 MySQL InnoDB 为例(最典型、最常问),说明 MVCC 是如何映射到四种标准隔离级别的。
DB_TRX_ID:最后一次修改该行的事务 IDDB_ROLL_PTR:回滚指针,指向 undo log 中的旧版本MVCC 几乎不生效
✅ 实现方式:
读最新数据(无视事务状态)
❌ 问题:脏读、不可重复读、幻读
每次读都生成新的 ReadView
✅ MVCC 映射规则:
每次 SELECT:
生成新 ReadView
遍历版本链
找到第一个已提交且可见的版本
❌ 问题:
事务开始时生成一次 ReadView
✅ MVCC 映射规则:
事务第一次 SELECT:
生成 ReadView(快照)
后续 SELECT:
复用同一 ReadView
✅ 解决的问题:
⚠️ 幻读:
MVCC + 锁
✅ 实现方式:
SELECT → 加共享锁
写 → 加排他锁
❌ 并发性能最差
| 隔离级别 | ReadView 时机 | 是否用 MVCC | 锁 | 典型问题 |
|---|---|---|---|---|
| RU | 无 | 否 | 无 | 脏读 |
| RC | 每次查询 | 是 | 行锁 | 不可重复读 |
| RR | 事务开始 | 是 | Next-Key | 基本无 |
| Serializable | 无 | 弱 | 强锁 | 性能差 |
MVCC 用“快照”控制能看到哪些版本,用“锁”控制能不能改;隔离级别就是两者组合的策略。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。