2025年9月25日: PostgreSQL 18 釋出!
支援版本: 當前 (18) / 17 / 16 / 15 / 14
開發版本: devel

47.10. 兩階段提交支援邏輯解碼 #

使用基本的輸出外掛回撥(例如,begin_cbchange_cbcommit_cbmessage_cb),兩階段提交命令如 PREPARE TRANSACTIONCOMMIT PREPAREDROLLBACK PREPARED 不會被解碼。雖然 PREPARE TRANSACTION 被忽略,但 COMMIT PREPARED 會被解碼為 COMMIT,而 ROLLBACK PREPARED 會被解碼為 ROLLBACK

為了支援兩階段命令的流式傳輸,輸出外掛需要提供額外的回撥。有多個兩階段提交回調是必需的(begin_prepare_cbprepare_cbcommit_prepared_cbrollback_prepared_cbstream_prepare_cb),還有一個可選的回撥(filter_prepare_cb)。

如果提供了用於解碼兩階段提交命令的輸出外掛回撥,那麼在執行 PREPARE TRANSACTION 時,該事務的更改會被解碼,傳遞給輸出外掛,並呼叫 prepare_cb 回撥。這與基本解碼設定不同,在基本解碼設定中,只有在事務提交時更改才會被傳遞給輸出外掛。已準備事務的開始由 begin_prepare_cb 回撥指示。

當使用 ROLLBACK PREPARED 回滾已準備的事務時,會呼叫 rollback_prepared_cb 回撥;當使用 COMMIT PREPARED 提交已準備的事務時,會呼叫 commit_prepared_cb 回撥。

輸出外掛可以選擇透過 filter_prepare_cb 定義過濾規則,以便僅解碼兩階段的特定事務。這可以透過對 gid 進行模式匹配或使用 xid 進行查詢來實現。

想要解碼已準備事務的使用者需要注意以下幾點:

  • 如果已準備的事務已獨佔鎖定 [user] 目錄表,則解碼 prepare 可能會阻塞直到主事務被提交。

  • 使用此功能構建分散式兩階段提交的邏輯複製解決方案可能會發生死鎖,如果已準備事務已獨佔鎖定 [user] 目錄表。為避免這種情況,使用者必須避免在此類事務中持有目錄表的鎖(例如,顯式的 LOCK 命令)。有關詳細資訊,請參閱 第 47.8.2 節

提交更正

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