温馨提示×

温馨提示×

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

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

什么是数据库MVCC

发布时间:2026-07-15 03:57:48 来源:亿速云 阅读:110 作者:小樊 栏目:数据库

MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种数据库并发控制机制,用来在不加锁或少加锁的情况下,实现高并发读写,同时保证事务隔离性。


一、MVCC 的核心思想

同一份数据保存多个版本,不同事务根据可见性规则读取不同版本。

  • 读操作:不加锁,读“历史版本”
  • 写操作:创建新版本,而不是覆盖旧数据
  • 不同事务看到的数据可能不同(快照读)

二、为什么需要 MVCC?

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

方式 问题
表锁 / 行锁 并发性能差
读写互斥 读阻塞写,写阻塞读

MVCC 的优势:

  • ✅ 读写不冲突
  • ✅ 提高并发性能
  • ✅ 支持事务隔离级别(尤其是 RC、RR)

三、MVCC 在 InnoDB 中的实现(重点)

以 MySQL InnoDB 为例。

1️⃣ 核心组件

(1)隐藏字段(每行记录都有)

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

(2)Undo Log(版本链)

  • 每次更新 / 删除都会生成 undo log
  • 多个版本通过 DB_ROLL_PTR 形成 版本链
当前记录 → undo1 → undo2 → undo3

(3)Read View(一致性视图)

事务开始时生成 Read View,用于判断哪些版本“可见”。

Read View 包含:

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

2️⃣ 可见性判断规则(重点)

一个版本是否可见,判断逻辑如下:

  1. 事务 ID < min_trx_id
    • ✅ 已提交,可见
  2. 事务 ID ≥ max_trx_id
    • ❌ 未来事务,不可见
  3. 事务 ID 在活跃列表中
    • ❌ 未提交,不可见
  4. 事务 ID 不在活跃列表中
    • ✅ 已提交,可见

四、MVCC 支持的隔离级别

隔离级别 MVCC 行为
READ COMMITTED 每次查询生成新的 Read View
REPEATABLE READ 事务开始时生成一次 Read View(默认)
READ UNCOMMITTED 不使用 MVCC
SERIALIZABLE 退化为锁

✅ InnoDB 默认 RR 级别就是通过 MVCC 实现的


五、快照读 vs 当前读

类型 示例 是否用 MVCC
快照读 SELECT ✅ 是
当前读 SELECT ... FOR UPDATE / UPDATE / DELETE ❌ 否(加锁)

六、MVCC 的优缺点

✅ 优点

  • 高并发
  • 读写不冲突
  • 实现非锁定一致性读

❌ 缺点

  • undo log 占用空间
  • 长事务会导致版本链过长
  • 实现复杂

七、一句话总结

MVCC 通过保存数据的多个历史版本,让不同事务读取到符合隔离级别的数据,从而实现无锁或低锁的高并发访问。

如果你愿意,我可以:

  • 用 一张图画版本链 + Read View
  • 用 一个事务执行过程逐步演示 MVCC
  • 对比 MVCC vs 锁机制
向AI问一下细节

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

AI
助
手