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