9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

74.1. 事务和标识符 #

可以使用BEGINSTART TRANSACTION 显式创建事务,并使用COMMITROLLBACK 结束事务。显式事务之外的SQL语句会自动使用单语句事务。

每个事务都由一个唯一的VirtualTransactionId (也称为virtualXIDvxid)标识, 它由一个后端ID(或backendID)和一个分配给每个后端的 本地顺序号组成,称为localXID。例如,虚拟事务ID 4/12532backendID4localXID12532

非虚拟TransactionId(或xid),例如 278394,是从一个全局计数器中按顺序分配给事务的, 该计数器由PostgreSQL集群中的所有数据库共用。 这种分配发生在事务首次写入数据库时。这意味着编号较低的xid在编号较高 的xid之前开始写入。请注意,事务首次写入数据库的顺序可能与事务开始的 顺序不同,特别是当事务以仅执行数据库读取的语句开始时。

内部事务ID类型xid是32位宽,并且每 40亿次事务后回绕。 在每次回绕期间,一个32位的纪元会递增。还有一种64位类型 xid8,它包含了这个纪元,因此在安装的生命周期内 不会回绕;它可以通过类型转换转换为xid。 表 9.80中的函数 返回xid8值。Xid被用作 PostgreSQLMVCC并发机制和流复制的基础。

当一个顶层事务带有(非虚拟的)xid提交时, 它会在pg_xact目录中标记为已提交。 如果启用了track_commit_timestamp, 额外的信息会记录在pg_commit_ts目录中。

除了vxidxid之外, 预备事务还被分配了全局事务标识符 (GID)。GID 是长度最多为 200 字节的字符串字面值, 必须在当前预备事务中唯一。GID 到 xid 的映射显示在 pg_prepared_xacts中。