温馨提示×

温馨提示×

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

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

什么是MVCC多版本控制

发布时间:2026-07-15 05:49:55 来源:亿速云 阅读:82 作者:小樊 栏目:数据库

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种数据库并发控制机制,核心思想是:对同一数据保存多个历史版本,读写互不阻塞,从而提升并发性能并保证事务隔离性


一、为什么需要 MVCC?

在没有 MVCC 的情况下,数据库通常使用

  • 读加锁 → 写阻塞
  • 写加锁 → 读阻塞

这会导致:

  • 并发性能差
  • 容易出现锁等待、死锁

MVCC 的目标是:

读不加锁,写不阻塞读


二、MVCC 的核心思想

同一行数据可以有多个版本:

  • 每个事务看到的是某个时间点的数据快照
  • 写操作创建新版本,而不是直接覆盖旧数据
  • 旧版本数据仍然可以被其他事务读取

三、MVCC 的关键组成(以 MySQL InnoDB 为例)

1️⃣ 隐藏字段(每行记录中)

InnoDB 每行记录中隐含以下字段:

字段 作用
DB_TRX_ID 最后修改该行的事务 ID
DB_ROLL_PTR 回滚指针,指向 undo log
DB_ROW_ID 行 ID(可选)

2️⃣ 事务 ID(Transaction ID)

  • 每个事务开启时分配一个递增的事务 ID
  • 用于判断数据版本是否对当前事务可见

3️⃣ Undo Log(回滚日志)

  • 保存数据的历史版本
  • 用于:
    • 事务回滚
    • 构造一致性读视图(快照读)

4️⃣ Read View(一致性读视图)

Read View 决定:

当前事务能看到哪些版本的数据

Read View 包含:

  • 当前活跃事务 ID 列表
  • 最小事务 ID
  • 下一个将要分配的事务 ID

判断规则(简化版):

数据版本的事务 ID 是否可见
< 最小活跃事务 ID ✅ 可见
> 当前事务 ID ❌ 不可见
在活跃事务列表中 ❌ 不可见
否则 ✅ 可见

四、MVCC 的工作流程(示例)

假设:

  • 事务 A(ID=100)启动
  • 事务 B(ID=101)启动并修改数据

执行过程:

  1. 事务 B 修改一行数据:

    • 不覆盖原数据
    • 原数据写入 undo log
    • 新数据 DB_TRX_ID = 101
  2. 事务 A 查询该行:

    • 生成 Read View
    • 发现 DB_TRX_ID = 101 比自己新
    • 通过 undo log 找到旧版本
    • 返回旧数据

✅ 事务 A 读到的仍是事务开始时的数据快照


五、MVCC 支持的隔离级别

隔离级别 是否使用 MVCC
READ UNCOMMITTED
READ COMMITTED ✅(每次读生成新 Read View)
REPEATABLE READ ✅(事务开始时生成 Read View)
SERIALIZABLE ❌(通常退化为锁)

MySQL InnoDB 的 REPEATABLE READ 是依靠 MVCC 实现的


六、MVCC 的优缺点

✅ 优点

  • 读写不冲突,并发性能高
  • 避免大量加锁
  • 天然支持一致性非锁定读

❌ 缺点

  • 需要维护多版本数据(undo log)
  • undo log 过多会影响性能
  • 长事务可能导致版本堆积

七、一句话总结

MVCC 通过保存数据的多个历史版本,让不同事务看到不同时间点的数据,从而实现无锁读、高并发和事务隔离。

如果你愿意,我也可以:

  • 解释 MVCC
  • 对比 MVCC vs 锁机制
  • 结合 MySQL / PostgreSQL 具体实现讲
向AI问一下细节

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

AI