↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1
历史版本PostgreSQL 8.2 已于 2011 年 12 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

PREPARE TRANSACTION

PREPARE TRANSACTION — 为两阶段提交准备当前事务

大纲

PREPARE TRANSACTION transaction_id

描述

PREPARE TRANSACTION为两阶段提交准备当前事务。执行此命令后,该事务将不再与当前会话相关联;相反,它的状态会被完整地存储到磁盘上,因此即使在请求提交之前数据库发生崩溃,它也极有可能成功提交。

事务进入预备状态后,稍后可以分别使用COMMIT PREPARED或ROLLBACK PREPARED来提交或回滚。发出这些命令的不必是执行原始事务的那个会话,任何会话都可以这样做。

从发出该命令的会话来看,PREPARE TRANSACTION颇似ROLLBACK:执行之后,将不再有活动的当前事务,并且该预备事务的效果也不再可见。(如果该事务随后被提交,这些效果会再次可见。)

如果PREPARE TRANSACTION因任何原因失败,它就等同于执行了一次ROLLBACK:当前事务会被取消。

参数

transaction_id

一个任意标识符,后续可通过它在COMMIT PREPARED或ROLLBACK PREPARED中标识该事务。该标识符必须写成字符串字面值,长度必须小于 200 字节,并且不能与当前任何已处于预备状态的事务标识符相同。

注解

该命令必须在事务块内部使用。请用BEGIN启动事务块。

目前不允许 PREPARE 一个执行过任何涉及临时表操作、创建过 WITH HOLD 游标,或执行过 LISTEN 或 UNLISTEN 的事务。 这些特性与当前会话绑定得太紧密,在一个要预备的事务中没有用处。

如果该事务曾用SET修改过任何运行时参数,那么这些效果在执行PREPARE TRANSACTION之后仍会保留,并且不会受到后续任何COMMIT PREPARED或ROLLBACK PREPARED的影响。因此,仅就这一点而言,PREPARE TRANSACTION的行为更像COMMIT而不是ROLLBACK。

当前所有处于预备状态的事务都列在pg_prepared_xacts系统视图中。

从性能角度看,让事务长时间停留在预备状态并不明智:这会妨碍 VACUUM回收存储空间。还要记住,该事务会继续持有 它原本持有的所有锁。此功能的预期用法是:一旦外部事务管理器确认 其他数据库也已准备好提交,就尽快提交或回滚该预备事务。

如果你要大量使用预备事务,可能需要增大 max_prepared_transactions的值,因为默认设置 相当小(以免为不使用它的人浪费资源)。建议让它至少等于 max_connections,这样每个会话都可以有一个 挂起的预备事务。

示例

为两阶段提交准备当前事务,并使用foobar作为事务标识符:

PREPARE TRANSACTION 'foobar';

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。