# 准备交易

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

# 概要

PREPARE TRANSACTION transaction_id

# 描述

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

一旦准备好,事务可以稍后提交或回滚提交准备或者已准备好回滚, 分别。这些命令可以从任何会话发出,而不仅仅是执行原始事务的那个。

从发行环节来看,准备交易不像一个回滚command:执行后,没有活动的当前事务,准备好的事务的效果不再可见。(如果事务提交,效果将再次可见。)

如果准备交易命令因任何原因失败,它变成回滚: 当前交易被取消。

# 参数

transaction_id

一个任意标识符,稍后标识此交易提交准备或者已准备好回滚.标识符必须写为字符串文字,并且长度必须小于 200 字节。它不能与用于任何当前准备的事务的标识符相同。

# 笔记

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

此命令必须在事务块内使用。采用开始开始一个。

目前不允许准备执行了涉及临时表或会话的临时命名空间的任何操作的事务,创建了任何游标按住, 或执行,不听, 或者通知.这些功能与当前会话联系得太紧密,无法在要准备的事务中使用。

如果事务修改了任何运行时参数(没有当地的选项),这些效果在准备交易, 以后不会受到影响提交准备或者已准备好回滚.因此,在这一方面准备交易行为更像犯罪回滚.

所有当前可用的准备好的事务都列在pg_prepared_xacts系统视图。

# 警告

让事务长时间处于准备状态是不明智的。这会干扰能力真空回收存储,在极端情况下可能导致数据库关闭以防止事务 ID 回绕(请参阅第 25.1.5 节)。还要记住,事务继续持有它持有的任何锁。该功能的预期用途是,一旦外部事务管理器验证其他数据库也准备好提交,准备好的事务通常将被提交或回滚。

如果您没有设置外部事务管理器来跟踪准备好的交易并确保它们及时关闭,最好通过设置禁用准备好的交易功能最大限度_准备好的_交易为零。这将防止意外创建准备好的事务,这些事务可能会被遗忘并最终导致问题。

# 例子

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

PREPARE TRANSACTION 'foobar';

# 兼容性

准备交易是一个 PostgreSQL 扩展。它旨在供外部事务管理系统使用,其中一些已被标准覆盖(例如 X/Open XA),但这些系统的 SQL 端并未标准化。

# 也可以看看

提交准备,已准备好回滚