Postgresql 中文操作指南

PREPARE TRANSACTION

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

Synopsis

PREPARE TRANSACTION transaction_id

Description

PREPARE TRANSACTION 准备当前事务用于两阶段提交。此命令后,事务将不再与当前会话关联,而是会将状态完全存储在磁盘中,并且几率非常高,即使在请求提交之前发生数据库崩溃,也能成功地提交事务。

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

从发出事务的会话的角度来看, PREPARE TRANSACTIONROLLBACK 命令非常相似:执行该命令后,将没有处于活动状态的当前事务,并且已准备事务的效果也将不再可见。(提交事务后,效果将再次变得可见。)

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

Parameters

  • transaction_id

    • 稍后将为 COMMIT PREPAREDROLLBACK PREPARED 标识此事务的任意标识符。必须将标识符写为字符串文字,并且长度必须小于 200 个字节。它不得与用于任何当前准备事务的标识符相同。

Notes

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

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

当前不允许 PREPARE 执行涉及临时表或会话的临时命名空间的任何操作、创建任何游标 WITH HOLD 或执行 LISTENUNLISTENNOTIFY 的事务。这些特性与当前会话联系得太紧密,没有办法将其用于需要准备的事务中。

如果事务使用 SET 对任何运行时参数进行修改(无 LOCAL 选项),则这些修改在 PREPARE TRANSACTION 后仍然存在,并且不受任何 COMMIT PREPAREDROLLBACK PREPARED 影响。因此,仅就这一点而言, PREPARE TRANSACTION 的行为更类似于 COMMIT 而不是 ROLLBACK

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

Caution

将事务置于已准备状态并长时间放置是明智的做法。这将影响 VACUUM 回收存储的能力,在极端情况下,会导致数据库关闭以防止事务 ID 环绕(请参见 Section 25.1.5 )。另外请记住,事务将继续持有其持有的任何锁。该功能的预期用法是,在外部事务管理器验证其他数据库也准备提交后,准备好的事务通常会提交或回滚。

如果您尚未设置外部事务管理器来跟踪已准备事务并确保其及时关闭,则最好通过将 max_prepared_transactions 设置为零来禁用已准备事务功能。这将防止意外创建已准备事务,避免忘记这些事务并最终导致问题。

Examples

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

PREPARE TRANSACTION 'foobar';

Compatibility

PREPARE TRANSACTION 是 PostgreSQL 的扩展。旨在供外部事务管理系统使用,其中一些系统受标准(如 X/Open XA)的约束,但这些系统的 SQL 端未标准化。