首页/数据/SQL 速查/MVCC 与快照读:为什么两次查询结果不同
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

MVCC 与快照读:为什么两次查询结果不同

多版本并发控制让读不阻塞写:PostgreSQL 每个语句取快照(READ COMMITTED)、REPEATABLE READ 取事务快照;InnoDB 通过 undo 构造一致性读视图。

SQL 速查数据更新于 2026-10-12

验证快照(PostgreSQL)

验证快照(PostgreSQL)
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT count(*) FROM orders;   -- 快照建立
-- 其它会话插入/提交新订单
SELECT count(*) FROM orders;   -- 仍返回快照时的数量
COMMIT;
PostgreSQLREAD COMMITTED:每条语句新快照;REPEATABLE READ:事务内固定
InnoDB一致性读基于 undo log 版本链;RR 下事务内读结果稳定
写读关系普通读不加锁、不阻塞写;写写冲突仍会互相等待

易错点

  • 长事务让旧快照长期存活:InnoDB 历史链表变长、PG 无法及时清理死元组,是性能劣化的常见根因
  • 一致性读读到的是快照,不是“此刻真实值”:库存判断等场景要配合锁读或原子 UPDATE 条件

数据来源与参考

  • PostgreSQL Documentation · Concurrency Control
  • MySQL 8.0 Reference Manual · InnoDB Multi-Versioning
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌