给定交易中其他交易的可见性

Visibility of other transactions inside given one

Postgres 如何根据隔离级别决定哪些事务对给定事务可见?

我知道 Postgres 使用 xminxmax 并将其与 xid 进行比较,但我没有找到具有适当细节的文章。

你知道引擎盖下的过程吗?

这取决于当前的快照

READ COMMITTED 事务为每个查询拍摄一个新的快照,而 REPEATABLE READSERIALIZABLE 事务在第一个查询为 运行 时拍摄快照并将其保留到交易的整个持续时间。

快照在include/utils/snapshot.h中定义为struct SnapshotData,主要包含以下内容:

  • 最小交易 ID xmin:所有较早的交易对该快照可见。

  • 一个最大的交易 ID xmax:所有后来的交易对该快照不可见。

  • 一个交易 ID 数组 xid,其中包含对此快照不可见的所有中间交易。

要确定元组是否对快照可见,其 xmin 必须是可见的已提交事务 ID,并且其 xmax 不能是可见的已提交事务 ID。

要确定事务是否已提交,必须查阅提交日志,除非元组的提示位 (哪些缓存该信息)已经设置。