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