基本的な出力プラグインコールバック(例えば、begin_cb、change_cb、commit_cb、message_cb)では、PREPARE TRANSACTION、COMMIT PREPARED、ROLLBACK PREPAREDのような2相コミットコマンドはデコードされません。
PREPARE TRANSACTIONは無視されますが、COMMIT PREPAREDはCOMMITとしてデコードされ、ROLLBACK PREPAREDはROLLBACKとしてデコードされます。
2相コマンドのストリーミングをサポートするために、出力プラグインは追加のコールバックを提供する必要があります。
複数の必要な2相コミットコールバック(begin_prepare_cb、prepare_cb、commit_prepared_cb、rollback_prepared_cb、stream_prepare_cb)とオプションのコールバック(filter_prepare_cb)があります。
2相コミットコマンドをデコードするための出力プラグインコールバックが提供されている場合、PREPARE TRANSACTIONで、そのトランザクションの変更がデコードされ、出力プラグインに渡され、prepare_cbコールバックが呼び出されます。
これは、トランザクションがコミットされたときにのみ変更が出力プラグインに渡される基本的なデコード設定とは異なります。
準備されたトランザクションの開始は、begin_prepare_cbコールバックによって示されます。
準備されたトランザクションがROLLBACK PREPAREDを使用してロールバックされると、rollback_prepared_cbコールバックが呼び出されます。
準備されたトランザクションがCOMMIT PREPAREDを使用してコミットされると、commit_prepared_cbコールバックが呼び出されます。
オプションで、出力プラグインはfilter_prepare_cbを使ってフィルタリング規則を定義し、特定のトランザクションのみを2つの相でデコードすることができます。
これはgidでパターンマッチングを行うか、xidを使って検索することで実現できます。
準備されたトランザクションをデコードしようとするユーザは、以下の点に注意する必要があります。
準備されたトランザクションが[user]カタログテーブルを排他的にロックしている場合、メイントランザクションがコミットされるまで準備のデコードをブロックできます。
この機能を使用して分散2相コミットを構築するロジカルレプリケーションソリューションは、準備されたトランザクションが[user]カタログテーブルを排他的にロックした場合にデッドロックを発生する可能性があります。
これを回避するために、ユーザはこのようなトランザクションでカタログテーブルをロック(例えば明示的なLOCKコマンド)しないようにしなければなりません。
詳細については49.8.2を参照してください。