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