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 回绕(参见 第 24.1.5 节)。还要记住该事务将继续持有它持有的任何锁。该功能的预定用法是,一旦外部事务管理器验证其他数据库也已准备提交,就立即提交或回滚已准备事务。
如果您尚未设置外部事务管理器来跟踪已准备事务并确保它们得到及时关闭,最好通过将 max_prepared_transactions 设置为零来禁用已准备事务功能。这可以防止创建可能被遗忘并最终导致问题的已准备事务。
使用 foobar
作为事务标识符来为两阶段提交准备当前事务
PREPARE TRANSACTION 'foobar';
PREPARE TRANSACTION
是一个 PostgreSQL 扩展。其目标是供外部事务管理系统使用,其中一些系统受标准(例如 X/Open XA)覆盖,而这些系统的 SQL 方面未标准化。