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 方面並未標準化。
如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。