支援的版本:目前版本 (17) / 16 / 15 / 14
開發版本:開發版本

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 進行查找來實現。

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

  • 如果已準備的交易獨佔鎖定了 [使用者] 目錄表,則解碼準備可能會阻塞,直到主交易被提交。

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

提交更正

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