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个字节。它不能与用于任何当前准备的事务的标识符相同。
注意事项
PREPARE TRANSACTION 不适用于应用程序或交互式会话。其目的是允许外部事务管理器跨多个数据库或其他事务资源执行原子全局事务。除非您正在编写事务管理器,否则您可能不应该使用 PREPARE TRANSACTION 。
必须在事务块中使用此命令。使用 BEGIN启动一个。
目前不允许 PREPARE 执行涉及临时表或会话的临时命名空间的任何操作的事务,创建任何游标 WITH HOLD ,或执行 LISTEN , UNLISTEN 或 NOTIFY 。这些功能太紧密了当前会话在要准备的事务中有用。
如果事务使用 SET (没有 LOCAL 选项)修改了任何运行时参数说明,则这些效果在 PREPARE TRANSACTION 之后仍然存在,并且不会受到任何后续 COMMIT PREPARED 或 ROLLBACK PREPARED 的影响。因此,在这方面, PREPARE TRANSACTION 更像是 COMMIT 而不是 ROLLBACK 。
所有当前可用的准备事务都列在 pg_prepared_xacts系统视图中。
注意
将 事物 保持在准备状态很长时间是不明智的。这将干扰 VACUUM 回收存储的能力,并且在极端情况下可能导致数据库关闭以防止事务ID环绕。还要记住,事物继续持有它持有的任何锁。该功能的预期用途是,一旦外部事务管理器验证其他数据库也准备提交,通常就会提交或回滚准备好的事务。
如果您尚未设置外部事务管理器来跟踪已准备好的事务并确保它们立即关闭,则最好通过将 max_prepared_transactions 设置为零来禁用准备事务功能。这样可以防止意外创建准备好的事务,这些事务可能会被遗忘并最终导致问题。
示例
使用 foobar 作为事务标识符,为两阶段提交准备当前事务:
PREPARE TRANSACTION 'foobar';