2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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

PREPARE TRANSACTION

PREPARE TRANSACTION — 准备当前事务以进行两阶段提交

概要

PREPARE TRANSACTION transaction_id

描述

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

一旦准备好,事务稍后就可以使用 COMMIT PREPAREDROLLBACK PREPARED 进行提交或回滚。这些命令可以从任何会话发出,而不仅仅是执行原始事务的那个会话。

从发出命令的会话的角度来看,PREPARE TRANSACTIONROLLBACK 命令非常相似:执行后,没有当前活动的事务,并且已准备好的事务的影响不再可见。(如果事务被提交,其影响将重新可见。)

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

参数

transaction_id

一个任意的标识符,稍后用于 COMMIT PREPAREDROLLBACK PREPARED 标识此事务。标识符必须写成字符串字面量,并且长度必须小于 200 字节。它不能与当前任何已准备好的事务的标识符相同。

注释

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

此命令必须在事务块内使用。使用 BEGIN 来启动一个事务块。

目前不允许 PREPARE 任何执行了涉及临时表或会话临时命名空间的事务,创建了 WITH HOLD 的游标,或者执行了 LISTENUNLISTENNOTIFY 的事务。这些功能与当前会话的关联过于紧密,不适合在需要准备的事务中使用。

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

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

注意

将事务长时间保持在准备状态是不明智的。这会干扰 VACUUM 重新回收存储空间的能力,在极端情况下可能导致数据库关闭以防止事务 ID 回绕(参见 第 24.1.5 节)。同时请注意,事务将继续持有其原有的锁。该功能的设计用途是,外部事务管理器在验证其他数据库也准备好提交后,通常会立即提交或回滚一个已准备好的事务。

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

示例

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

PREPARE TRANSACTION 'foobar';

兼容性

PREPARE TRANSACTIONPostgreSQL 的一个扩展。它 intended for use by external transaction management systems(意图由外部事务管理系统使用),其中一些系统受到标准(例如 X/Open XA)的约束,但这些系统的 SQL 部分并未标准化。

提交更正

如果您在文档中发现任何不正确、不符合您对特定功能的体验或需要进一步澄清的内容,请使用 此表单 来报告文档问题。