温馨提示×

温馨提示×

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

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

数据库MVCC原理是什么

发布时间:2026-07-15 04:19:50 来源:亿速云 阅读:114 作者:小樊 栏目:数据库

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种数据库并发控制机制,核心思想是:

对同一数据保存多个版本,读写互不阻塞,通过版本判断可见性来实现一致性读。

下面从原理、实现、流程、优缺点几个方面系统说明。


一、MVCC 要解决什么问题?

传统并发控制方式的问题:

  • 加锁(Locking)
    • 读阻塞写、写阻塞读
    • 并发性能差

MVCC 的目标:

  • ✅ 读不加锁
  • ✅ 读写不冲突
  • ✅ 提供一致性读(快照读)

二、MVCC 的核心思想

数据不是直接覆盖更新,而是保留多个版本,通过“版本可见性规则”决定当前事务能看到哪个版本。

关键点:

  1. 每一行数据有多个版本
  2. 每个事务有一个“快照”
  3. 通过版本号 / 时间戳 / 事务ID 判断可见性

三、MVCC 的典型实现(以 InnoDB 为例)

1️⃣ 核心数据结构

(1)事务 ID(Transaction ID)

  • 每个事务开始时分配一个递增的事务 ID(trx_id)

(2)行记录中的隐藏字段

InnoDB 每行记录中隐藏字段:

字段 含义
DB_TRX_ID 最后修改该行的事务 ID
DB_ROLL_PTR 回滚指针,指向 undo log
DB_ROW_ID 行ID(无主键时)

2️⃣ Undo Log(版本链)

  • 更新 / 删除时:
    • 不立即删除旧数据
    • 将旧版本写入 undo log
  • 多个旧版本通过 回滚指针形成版本链
当前行 → undo1 → undo2 → undo3

3️⃣ Read View(快照)

事务在第一次读时生成 Read View,用于判断版本可见性。

Read View 包含:

  • m_ids:当前活跃事务列表
  • min_trx_id:最小活跃事务 ID
  • max_trx_id:下一个将被分配的事务 ID
  • creator_trx_id:当前事务 ID

四、MVCC 可见性判断规则(重点)

判断某行版本是否可见:

规则总结

  1. 当前事务自己修改的版本 → 可见
  2. 事务 ID < 最小活跃事务 ID → 已提交,可见
  3. 事务 ID ≥ max_trx_id → 未来事务,不可见
  4. 事务 ID 在活跃事务列表中 → 未提交,不可见
  5. 否则 → 已提交,可见

如果不可见:

  • 沿着 undo log 版本链找上一个版本
  • 重复判断

五、MVCC 下的两种读

类型 是否使用 MVCC 说明
快照读 ✅ SELECT(普通)
当前读 ❌ SELECT ... FOR UPDATE、UPDATE、DELETE
  • 快照读:基于 MVCC
  • 当前读:加锁,读最新数据

六、MVCC 的工作流程示例

示例:事务 A 读数据,事务 B 修改数据

  1. 事务 A 开始,生成 Read View
  2. 事务 B 更新一行并提交
  3. 事务 A 再次查询:
    • 判断 B 的 trx_id 是否在活跃事务列表中
    • 若不可见 → 沿 undo log 找旧版本
    • 返回旧数据

✅ 事务 A 看不到事务 B 的修改(可重复读)


七、MVCC 的优点

✅ 读写不阻塞
✅ 高并发性能
✅ 天然支持 可重复读
✅ 避免大量加锁


八、MVCC 的缺点与限制

❌ 只适用于 读已提交 / 可重复读
❌ 需要维护 undo log(空间、清理)
❌ 无法防止 幻读(InnoDB 用 Next-Key Lock 解决)
❌ 写仍然需要锁


九、不同数据库的 MVCC 对比

数据库 MVCC 实现
MySQL InnoDB undo log + Read View
PostgreSQL tuple + xmin/xmax
Oracle undo segment
SQL Server 行版本存储

十、一句话总结

MVCC 通过保存数据的多个历史版本,让读操作基于“快照”而不是最新数据,从而避免加锁,提高并发性能。

如果你愿意,我可以:

  • 用 一张图画出 MVCC 版本链
  • 结合 可重复读 vs 读已提交 对比讲解
  • 用 真题/面试题形式帮你巩固
向AI问一下细节

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

AI
助
手