基本的な出力プラグインコールバック(例えば、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を参照してください。