Postgres如何根据隔离级别确定哪些事务对给定事务可见?
我知道Postgres使用xmin
和xmax
并将其与xid
进行比较,但是我没有找到具有适当细节的文章。
你知道这个过程吗?
答案 0 :(得分:2)
这取决于当前的快照。
READ COMMITTED
事务为每个查询拍摄一个新快照,而REPEATABLE READ
和SERIALIZABLE
事务在运行第一个查询时拍摄一个快照,并在整个事务期间将其保留。
快照在struct SnapshotData
中定义为include/utils/snapshot.h
,基本上包含以下内容:
最小事务ID xmin
:此快照可见所有较旧的事务。
最大事务ID xmax
:此快照不可见所有以后的事务。
事务ID的数组xid
,其中包含此快照不可见的所有中间事务。
要确定元组是否对快照可见,其xmin
必须是可见的已提交事务ID,并且其xmax
不能是可见的已提交事务ID。
要确定是否提交事务,必须查询提交日志,除非元组的提示位(用于缓存该信息)已经被使用设置。