首页 > 解决方案 > 给定交易中其他交易的可见性

问题描述

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

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

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

标签: postgresqlvisibilityisolation-levelmvcc

解决方案


这取决于当前的快照

READ COMMITTED事务为每个查询拍摄一个新的快照,而REPEATABLE READ事务SERIALIZABLE在第一个查询运行时拍摄一个快照,并在整个事务期间保留它。

快照的定义如下struct SnapshotDatainclude/utils/snapshot.h基本上包含以下内容:

  • 最小事务 ID xmin:所有旧事务对此快照可见。

  • 最大事务 ID xmax:此快照看不到所有后续事务。

  • 一组事务 ID xid,其中包含此快照不可见的所有中间事务。

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

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


推荐阅读