给定一个内部其他事务的可见性

时间:2018-12-12 22:08:00

标签: postgresql visibility isolation-level mvcc

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

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

你知道这个过程吗?

1 个答案:

答案 0 :(得分:2)

这取决于当前的快照

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

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

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

  • 最大事务ID xmax:此快照不可见所有以后的事务。

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

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

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