受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

PREPARE TRANSACTION

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

Synopsis

PREPARE TRANSACTION transaction_id

描述

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

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

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

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

参数

transaction_id

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

注解

PREPARE TRANSACTION并非供应用程序或交互式会话使用。它的目的是让外部事务管理器能够跨多个数据库或其他事务性资源执行原子性的全局事务。除非是在编写事务管理器,否则通常不应使用PREPARE TRANSACTION

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

当前不允许将执行过以下任一操作的事务置为预备状态:涉及临时表或会话临时命名空间的操作、创建任何WITH HOLD游标,或执行过LISTENUNLISTENNOTIFY。这些特性与当前会话绑定得过于紧密,因此在要进入预备状态的事务中没有意义。

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

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

Caution

让事务长时间停留在预备状态并不明智。这会妨碍VACUUM回收存储空间,在极端情况下甚至可能导致数据库为防止事务 ID 回卷而关闭(见Section 24.1.5)。还要记住,该事务会继续持有它原本持有的所有锁。此功能的预期用法是:一旦外部事务管理器确认其他数据库也已准备好提交,就尽快提交或回滚该预备事务。

如果没有设置外部事务管理器来跟踪预备事务并确保它们能被及时结束,最好将max_prepared_transactions设为零,从而禁用预备事务功能。这样可以防止意外创建预备事务,而这些事务随后可能被遗忘并最终引发问题。

示例

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

PREPARE TRANSACTION 'foobar';

兼容性

PREPARE TRANSACTIONPostgreSQL扩展。它供外部事务管理系统使用,其中有些系统受标准约束(例如 X/Open XA),但这些系统的 SQL 侧并未标准化。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。