在 MVCC(多版本并发控制) 中,快照读(Snapshot Read) 是实现高并发、避免锁阻塞的关键机制。下面从概念、原理、实现方式和典型场景几个方面说明。
快照读是指:
事务在读取数据时,不是读取最新已提交的数据,而是读取**事务开始时的数据库快照(一致性视图)**中的数据版本。
也就是说:
典型例子(以 MySQL InnoDB 为例):
SELECT * FROM user WHERE id = 1;
MVCC 通过以下机制实现快照读:
每行数据包含:
DB_TRX_ID:最后一次修改该行的事务 IDDB_ROLL_PTR:回滚指针,指向 undo log 中的旧版本roll_ptr 串联事务在快照读时生成 Read View,包含:
事务在读取一行时,会判断该版本是否对自己可见:
规则简化版:
DB_TRX_ID 是自己的事务 → 可见DB_TRX_ID 已提交且早于 Read View → 可见DB_TRX_ID 在活跃事务列表中 → 不可见,沿 undo log 找旧版本✅ 结果:
每个事务看到的是“自己开始那一刻”的一致性数据
| 类型 | 读取内容 | 是否加锁 | 示例 |
|---|---|---|---|
| 快照读 | 历史版本 | 否 | SELECT |
| 当前读 | 最新版本 | 是 | SELECT ... FOR UPDATE |
当前读会绕过 MVCC,直接读最新并加锁。
SELECT如果你愿意,我也可以结合 MySQL / PostgreSQL / Oracle 的具体实现来对比说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。