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 部分並未標準化。

提交更正

如果您在文件中發現任何不正確、不符合您對特定功能的體驗或需要進一步澄清的內容,請使用 此表單 來報告文件問題。