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

66.1. 事务和标识符 #

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

每个事务由唯一的VirtualTransactionId(也称为 virtualXIDvxid)标识,该标识由后端的进程号(或 procNumber)和分配给每个后端的顺序号组成,称为 localXID。例如,虚拟事务ID 4/12532procNumber4localXID12532

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

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

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

除了vxidxid之外,准备好的事务还会被分配全局事务 标识符(GID)。GID是最长可达200字节的字符串字面量,必须在当前 准备好的其他事务中唯一。GID到xid的映射如 pg_prepared_xacts所示。