温馨提示×

温馨提示×

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

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

快照读依赖MVCC吗

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

是的,快照读(Snapshot Read)依赖 MVCC(多版本并发控制)

下面从概念、原理和示例几个层面说明它们的关系。


一、什么是快照读

快照读是指:

在事务中读取数据时,读到的是某个时间点的一致性数据版本,而不是最新的实时数据。

MySQL InnoDB 中,典型的快照读语句包括:

SELECT ...

而下面的属于当前读(Current Read),不依赖快照:

SELECT ... FOR UPDATE;
SELECT ... LOCK IN SHARE MODE;
UPDATE ...
DELETE ...

二、MVCC 是什么

MVCC(Multi-Version Concurrency Control) 是 InnoDB 实现并发控制的核心机制,它通过:

  • undo log(回滚日志)
  • 事务版本号
  • Read View(一致性视图)

来实现:

同一行数据存在多个版本,不同事务可以看到不同版本的数据


三、快照读为什么依赖 MVCC

1️⃣ 快照读的本质

快照读的核心目标是:

在不加锁的情况下,读取一个一致性快照

而 MVCC 正好提供了:

  • 数据的多个历史版本
  • 判断“哪个版本对当前事务可见”的能力

2️⃣ 快照读的工作流程(简化)

以 InnoDB 为例:

  1. 事务开始时创建 Read View

    • 记录当前活跃事务列表
    • 记录最小事务 ID、最大事务 ID 等
  2. 执行 SELECT(快照读)

    • 从聚簇索引中读取数据
    • 判断数据版本是否对当前事务可见
    • 不可见 → 通过 undo log 回溯到可见版本

✅ 这个“版本判断 + undo log 回溯”的过程,就是 MVCC 的核心能力


四、对比:快照读 vs 当前读

类型 是否依赖 MVCC 是否加锁 读取内容
快照读 ✅ 依赖 ❌ 不加锁 一致性快照
当前读 ❌ 不依赖 ✅ 加锁 最新数据

五、一个直观例子

假设:

-- 事务 A
START TRANSACTION;
SELECT * FROM user WHERE id = 1;  -- 快照读

-- 事务 B
UPDATE user SET name='new' WHERE id = 1;
COMMIT;
  • 事务 A 的 SELECT 不会看到事务 B 的修改
  • 因为:
    • 事务 A 使用的是 自己的 Read View
    • MVCC 通过 undo log 找到事务 A 可见的旧版本

六、总结一句话

快照读依赖 MVCC
MVCC 为快照读提供了“多版本数据 + 可见性判断”,从而实现无锁的一致性读。

如果你愿意,我也可以帮你画一张 Read View + undo log + 快照读 的流程图,或者对比 RC 和 RR 下的快照读差异

向AI问一下细节

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

AI