Caution

PREPARE TRANSACTION

准备事务-为两阶段提交准备当前事务

Synopsis

PREPARE TRANSACTION transaction_id

Description

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

准备好之后,以后可以分别使用COMMIT PREPAREDROLLBACK PREPARED提交或回滚事务。这些命令可以从任何会话中发出,而不仅仅是执行原始事务的命令。

从发布会话的角度来看,PREPARE TRANSACTIONROLLBACK命令没有什么不同:执行它后,没有活动的当前事务,并且不再可见已准备好的事务的效果。 (如果提交事务,则效果将再次可见.)

如果PREPARE TRANSACTION命令由于任何原因而失败,它将变成ROLLBACK:当前事务被取消。

Parameters

  • transaction_id

    • 以后可以为COMMIT PREPAREDROLLBACK PREPARED标识此事务的任意标识符。标识符必须以字符串 Literals 形式编写,并且必须小于 200 个字节。它不能与用于任何当前准备的事务的标识符相同。

Notes

PREPARE TRANSACTION不适用于应用程序或交互式会话。其目的是允许外部事务 Management 器跨多个数据库或其他事务资源执行原子全局事务。除非您正在编写事务 Management 器,否则可能不应该使用PREPARE TRANSACTION

此命令必须在事务块内使用。使用BEGIN开始。

当前不允许PREPARE已执行涉及临时表或会话的临时名称空间的任何操作,创建任何游标WITH HOLD或已执行LISTENUNLISTENNOTIFY的事务。这些功能与当前会话紧密相关,无法在要准备的事务中使用。

如果事务使用SET修改了任何运行时参数(不带LOCAL选项),则这些影响将在PREPARE TRANSACTION之后持续存在,并且不会受到以后的COMMIT PREPAREDROLLBACK PREPARED的影响。因此,在这一方面,PREPARE TRANSACTIONROLLBACK更像COMMIT

pg_prepared_xacts系统视图中列出了所有当前可用的准备好的 Transaction。

Warning

将事务长时间处于准备状态是不明智的。这将干扰VACUUM回收存储的能力,在极端情况下,可能导致数据库关闭以防止事务 ID 环绕(请参见Section 24.1.5)。还请记住,事务将 continue 持有其持有的任何锁。该功能的预期用途是,通常在外部事务 Management 器确认其他数据库也准备提交后,就将提交或回滚准备好的事务。

如果您尚未设置外部事务 Management 器来跟踪已准备好的 Transaction 并确保迅速将其关闭,则最好通过将max_prepared_transactions设置为零来禁用已准备好的 Transaction 功能。这将防止意外创建准备好的 Transaction,该 Transaction 可能随后被忘记并最终导致问题。

Examples

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

PREPARE TRANSACTION 'foobar';

Compatibility

PREPARE TRANSACTION是 PostgreSQL 扩展。它旨在供外部事务 Management 系统使用,其中一些已包含在标准中(例如 X/Open XA),但是这些系统的 SQL 端未标准化。

See Also

COMMIT PREPARED, ROLLBACK PREPARED