可以使用BEGIN
或START TRANSACTION
显式创建事务,并使用COMMIT
或ROLLBACK
结束事务。显式事务之外的SQL语句会自动使用单语句事务。
每个事务都由一个唯一的VirtualTransactionId
(也称为virtualXID
或vxid
)标识,
它由一个后端ID(或backendID
)和一个分配给每个后端的
本地顺序号组成,称为localXID
。例如,虚拟事务ID
4/12532
的backendID
为
4
,localXID
为
12532
。
非虚拟TransactionId
(或xid
),例如
278394
,是从一个全局计数器中按顺序分配给事务的,
该计数器由PostgreSQL集群中的所有数据库共用。
这种分配发生在事务首次写入数据库时。这意味着编号较低的xid在编号较高
的xid之前开始写入。请注意,事务首次写入数据库的顺序可能与事务开始的
顺序不同,特别是当事务以仅执行数据库读取的语句开始时。
内部事务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
中。