是的,快照读(Snapshot Read)依赖 MVCC(多版本并发控制)。
下面从概念、原理和示例几个层面说明它们的关系。
快照读是指:
在事务中读取数据时,读到的是某个时间点的一致性数据版本,而不是最新的实时数据。
在 MySQL InnoDB 中,典型的快照读语句包括:
SELECT ...
而下面的属于当前读(Current Read),不依赖快照:
SELECT ... FOR UPDATE;
SELECT ... LOCK IN SHARE MODE;
UPDATE ...
DELETE ...
MVCC(Multi-Version Concurrency Control) 是 InnoDB 实现并发控制的核心机制,它通过:
来实现:
同一行数据存在多个版本,不同事务可以看到不同版本的数据
快照读的核心目标是:
在不加锁的情况下,读取一个一致性快照
而 MVCC 正好提供了:
以 InnoDB 为例:
事务开始时创建 Read View
执行 SELECT(快照读)
✅ 这个“版本判断 + undo log 回溯”的过程,就是 MVCC 的核心能力
| 类型 | 是否依赖 MVCC | 是否加锁 | 读取内容 |
|---|---|---|---|
| 快照读 | ✅ 依赖 | ❌ 不加锁 | 一致性快照 |
| 当前读 | ❌ 不依赖 | ✅ 加锁 | 最新数据 |
假设:
-- 事务 A
START TRANSACTION;
SELECT * FROM user WHERE id = 1; -- 快照读
-- 事务 B
UPDATE user SET name='new' WHERE id = 1;
COMMIT;
✅ 快照读依赖 MVCC
MVCC 为快照读提供了“多版本数据 + 可见性判断”,从而实现无锁的一致性读。
如果你愿意,我也可以帮你画一张 Read View + undo log + 快照读 的流程图,或者对比 RC 和 RR 下的快照读差异。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。