温馨提示×

温馨提示×

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

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

MVCC如何实现并发控制

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

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种通过保存数据的多个历史版本来实现并发控制的机制,常见于 MySQL(InnoDB)、PostgreSQL 等数据库。

下面从核心思想 → 实现结构 → 读写流程 → 与锁的关系 → 优缺点来系统说明。


一、MVCC 的核心思想

读写互不阻塞,读不阻塞写,写不阻塞读

MVCC 的核心思想是:

  • 对同一行数据保存多个版本
  • 不同事务看到的是不同时间点的数据快照
  • 通过“版本链 + 可见性判断”来实现并发控制

二、MVCC 依赖的核心结构

1️⃣ 事务 ID(Transaction ID)

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

2️⃣ 数据行中的隐藏字段(以 InnoDB 为例)

InnoDB 的每一行记录中,除了业务字段,还包含:

字段 作用
trx_id 最后修改该行的事务 ID
roll_pointer 指向 undo log 中旧版本记录的指针

3️⃣ Undo Log(版本链)

  • 每次修改(UPDATE / DELETE)都会生成 undo log
  • undo log 中保存了该行的旧版本
  • 多个 undo log 通过 roll_pointer 形成版本链
最新版本 → 旧版本 → 更旧版本 → ...

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

Read View 决定了:

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

Read View 中通常包含:

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

三、MVCC 的读写流程


✅ 读操作(SELECT)

1️⃣ 普通 SELECT(快照读)

InnoDB 使用 快照读(Snapshot Read):

流程:

  1. 为当前事务生成 Read View
  2. 读取最新数据行
  3. 判断该版本是否可见:
    • 若不可见 → 沿 undo log 版本链回退
    • 直到找到第一个可见版本

2️⃣ 可见性判断规则(简化版)

给定一个数据版本的 trx_id:

情况 是否可见
trx_id < min_trx_id ✅ 可见(已提交)
trx_id >= max_trx_id ❌ 不可见(未来事务)
trx_id 在活跃事务列表中 ❌ 不可见
trx_id == 当前事务 ID ✅ 可见

✅ 写操作(UPDATE / DELETE)

写操作并不是直接覆盖数据,而是:

  1. 拷贝当前行的新版本
  2. 将旧版本写入 undo log
  3. 更新:
    • trx_id
    • roll_pointer
  4. 加行级锁(X 锁)

✅ 写仍然需要锁
✅ 读不需要锁(MVCC 的优势)


四、MVCC 与事务隔离级别的关系

隔离级别 MVCC 行为
READ UNCOMMITTED 几乎不用 MVCC
✅ READ COMMITTED 每次 SELECT 生成新的 Read View
✅ REPEATABLE READ 事务开始时生成一次 Read View(InnoDB 默认)
SERIALIZABLE 退化为锁机制

五、MVCC 与锁的关系(重点)

机制 作用
MVCC 控制读一致性
锁(行锁、间隙锁) 控制写冲突

总结一句话:

MVCC 解决“读一致性”,锁解决“写冲突”


六、MVCC 的优缺点

✅ 优点

  • 读不加锁,性能高
  • 读写不互相阻塞
  • 实现非锁定的一致性读
  • 支持高并发

❌ 缺点

  • 实现复杂
  • 需要维护 undo log(空间与清理)
  • 长事务会导致版本链过长
  • 不适合大量写冲突场景

七、一句话总结

MVCC 通过保存数据的多个历史版本,配合事务 ID、undo log 和 Read View,让不同事务看到不同时间点的数据快照,从而实现无锁的一致性读。

如果你愿意,我可以:

  • 用 一张图画出版本链 + Read View
  • 用 具体 SQL 示例演示 MVCC 行为
  • 对比 MVCC vs 锁机制
向AI问一下细节

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

AI
助
手