全书目录

第八篇:PostgreSQL 完全指南 —— 时间档案馆宇宙

第七章:MVCC —— PostgreSQL 最值钱的底层魔法

1 分钟 343 字 第 171 / 962 个阅读单元

MVCC,中文常叫多版本并发控制

它是 PostgreSQL 之所以能高并发读写又保持一致性的核心。

最重要的一句理解:

PostgreSQL 的 UPDATE,在底层更像“写出一份新版本”,而不是原地改字”。

看这个时间线:

text
初始状态:
permit#42 = active

T1 开始事务
T2 开始事务

T2:
UPDATE permits
SET status = 'revoked'
WHERE permit_id = 42;

底层更像:
旧版本 v1: status = active
新版本 v2: status = revoked

然后不同事务看到的内容可能不同:

text
T1 的快照里,看到 v1
T3(更晚开始)看到 v2

这就是官方文档说的“每条 SQL / 每个事务看到的是某个时间点上的快照”。

可以把它想成:

text
同一份档案,不是只有一张纸
而是可能同时存在:
- 旧修订版
- 新修订版
- 仍对某些事务可见的历史版

所以 PostgreSQL 读写并发时,不是总靠“大家互相堵住”解决,而是靠:

  • 快照决定你能看见哪个版本
  • 锁只在必要时介入
  • VACUUM 负责回收不再需要的旧版本

这也解释了一个非常重要的运维事实:

长事务会拖住旧版本清理。

如果某个事务开着不提交,旧版本可能一直“还可能被它看见”,那 VACUUM 就不敢清掉,表会膨胀。