事务可以使用BEGIN或 START TRANSACTION显式创建,并使用 COMMIT或ROLLBACK结束。显式 事务之外的 SQL 语句会自动使用单语句事务。
每个事务都由唯一的VirtualTransactionId 标识(也称为virtualXID或vxid),它由 后端的进程号(即procNumber)和每个后端本地按顺序分配的编号组成, 后者称为localXID。例如,虚拟事务 ID 4/12532的procNumber 为4,localXID为 12532。
非虚拟的TransactionId(或xid),例如 278394,由 PostgreSQL集簇内所有数据库共用的全局计数器按顺序分配给事务。 这种分配发生在事务首次向数据库写入时。这意味着编号较小的 xid 比编号较大的 xid 更早开始写入。 需要注意的是,事务首次执行数据库写入的顺序可能与事务开始的顺序不同,尤其是在事务开始时的语句只执行数据库读取的情况下。
内部事务 ID 类型xid宽 32 位,每 40 亿个事务就会 回卷一次。每次回卷时都会递增一个 32 位 epoch。 另外还有一个 64 位类型xid8,它包含这个 epoch,因此在一次安装的生命周期内不会回卷; 必要时可以通过强制类型转换将其转换为 xid。Table 9.81 中的函数返回xid8值。xid 是 PostgreSQLMVCC并发机制和流复制的基础。
当带有(非虚拟)xid 的顶层事务提交时,它会在pg_xact 目录中被标记为已提交。如果启用了track_commit_timestamp,还会在pg_commit_ts 目录中记录附加信息。
除了vxid和xid之外, 预备事务还会被赋予全局事务标识符(GID)。GID 是长度最多 200 字节的字符串字面量,并且必须在当前其他处于预备状态的事务中保持唯一。GID 到 xid 的映射可在 pg_prepared_xacts中查看。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。