74.1. 事务和标识符#
可以使用BEGIN
或START TRANSACTION
显式创建事务,并使用COMMIT
或ROLLBACK
结束事务。显式事务之外的 SQL 语句自动使用单语句事务。
每个事务都由唯一的VirtualTransactionId
(也称为virtualXID
或vxid
)标识,它由后端 ID(或backendID
)和每个后端本地顺序分配的数字(称为localXID
)组成。例如,虚拟事务 ID4/12532
的backendID
为4
,localXID
为12532
。
非虚拟TransactionId
(或xid
),例如278394
,从PostgreSQL集群中所有数据库使用的全局计数器按顺序分配给事务。此分配发生在事务首次写入数据库时。这意味着编号较低的事务 ID 在编号较高的事务 ID 之前开始写入。请注意,事务执行其首次数据库写入的顺序可能与事务启动的顺序不同,特别是如果事务以仅执行数据库读取的语句开始。
内部事务 ID 类型xid
为 32 位宽,并且环绕每 40 亿个事务。在每次环绕期间,32 位纪元会增加。还有一种 64 位类型xid8
,它包含此纪元,因此在安装期间不会环绕;它可以通过转换转换为 xid。表 9.80中的函数返回xid8
值。Xid 用作PostgreSQL的MVCC并发机制和流复制的基础。
当具有(非虚拟)xid 的顶级事务提交时,它在pg_xact
目录中标记为已提交。如果启用了track_commit_timestamp,则在pg_commit_ts
目录中记录其他信息。
除了vxid
和xid
之外,已准备好的事务还会分配全局事务标识符 (GID)。GID 是长达 200 个字节的字符串文字,它在其他当前准备好的事务中必须是唯一的。GID 到 xid 的映射显示在pg_prepared_xacts
中。