温馨提示×

温馨提示×

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

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

MVCC隔离级别怎么映射

发布时间:2026-09-30 10:37:22 来源:亿速云 阅读:98 作者:小樊 栏目:数据库

MVCC(多版本并发控制)是数据库实现事务隔离级别的核心机制之一。不同隔离级别在 MVCC 下的“映射”方式,本质上是指:如何通过版本链、快照(ReadView)和锁,来限制事务能看到哪些数据版本。

下面以 MySQL InnoDB 为例(最典型、最常问),说明 MVCC 是如何映射到四种标准隔离级别的。


一、MVCC 的核心组成

  1. 隐藏列
    • DB_TRX_ID:最后一次修改该行的事务 ID
    • DB_ROLL_PTR:回滚指针,指向 undo log 中的旧版本
  2. Undo Log
    • 保存数据的历史版本,形成版本链
  3. ReadView(快照)
    • 记录当前活跃事务 ID 列表
    • 判断某个版本是否“对当前事务可见”

二、SQL 标准隔离级别与 MVCC 映射

1️⃣ Read Uncommitted(读未提交)

MVCC 几乎不生效

  • 直接读最新版本(包括未提交)
  • 不看 ReadView
  • 会看到脏读

✅ 实现方式:

读最新数据(无视事务状态)

❌ 问题:脏读、不可重复读、幻读


2️⃣ Read Committed(读已提交)

每次读都生成新的 ReadView

  • 只能看到 已提交事务 的版本
  • 同一事务内多次读,结果可能不同

✅ MVCC 映射规则:

每次 SELECT:
  生成新 ReadView
  遍历版本链
  找到第一个已提交且可见的版本

❌ 问题:

  • 不可重复读
  • 幻读(InnoDB 在 RC 下不完全解决)

3️⃣ Repeatable Read(可重复读,MySQL 默认)

事务开始时生成一次 ReadView

  • 整个事务期间使用同一个快照
  • 多次读结果一致

✅ MVCC 映射规则:

事务第一次 SELECT:
  生成 ReadView(快照)
后续 SELECT:
  复用同一 ReadView

✅ 解决的问题:

  • 脏读
  • 不可重复读

⚠️ 幻读:

  • 普通 SELECT(快照读):MVCC 解决
  • 当前读(SELECT … FOR UPDATE):靠 Next-Key Lock

4️⃣ Serializable(串行化)

MVCC + 锁

  • 读也加锁(S 锁)
  • 完全禁止并发修改

✅ 实现方式:

SELECT → 加共享锁
写 → 加排他锁

❌ 并发性能最差


三、MVCC 隔离级别映射总结表

隔离级别 ReadView 时机 是否用 MVCC 锁 典型问题
RU 无 否 无 脏读
RC 每次查询 是 行锁 不可重复读
RR 事务开始 是 Next-Key 基本无
Serializable 无 弱 强锁 性能差

四、一句话记忆

MVCC 用“快照”控制能看到哪些版本,用“锁”控制能不能改;隔离级别就是两者组合的策略。

如果你愿意,我也可以:

  • 画 版本链 + ReadView 判断流程图
  • 对比 PostgreSQL 的 MVCC 映射
  • 结合 面试题讲(比如“RR 怎么防幻读”)
向AI问一下细节

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

AI
助
手