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 部分未标准化。
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。