ストリーミングレプリケーションにおける同期レプリケーションと同じユーザインタフェースで、ロジカルデコーディングを使って同期レプリケーションソリューションを構築することができます。
そのためには、ストリーミングレプリケーションインタフェース(49.3参照)を使ってデータをストリーム出力します。
ストリーミングレプリケーションクライアントが行っているのと同じように、状態の更新
(53.4参照)メッセージを送信しなければなりません。
synchronous_standby_names
がサーバ全体に適用されるのに対し、ロジカルデコーディングを通じて変更データを受け取る同期レプリカは、単一のデータベースのスコープの範囲で動作します。
このことにより、複数のデータベースが同時に使用される環境では、ロジカルデコーディングを使った同期レプリケーションはうまく動きません。
同期レプリケーション設定では、トランザクションが[user]カタログテーブルを排他的にロックした場合、デッドロックが発生する可能性があります。 ユーザカタログテーブルに関する情報については49.6.2を参照してください。 これは、トランザクションの論理的なデコードがカタログテーブルをロックしてアクセスできるためです。 これを回避するために、ユーザは[user]カタログテーブルに対する排他ロックの取得を控える必要があります。 これは以下の方法で発生します。
トランザクションのpg_class
に対する明示的なLOCK
の発行。
トランザクション内のpg_class
に対してCLUSTER
を実行。
pg_class
上のLOCK
コマンドの後にPREPARE TRANSACTION
を実行し、2相トランザクションのロジカルデコーディングを可能にする。
pg_trigger
上のCLUSTER
コマンドの後にPREPARE TRANSACTION
を実行し、2相トランザクションのロジカルデコーディングを可能にする。
これにより、発行されたテーブルにトリガがある場合にのみデッドロックが発生します。
トランザクションの[user]カタログテーブルに対してTRUNCATE
を実行。
デッドロックの原因となるこれらのコマンドは、上記の明示的に指定されたシステムカタログテーブルだけでなく、他の[user]カタログテーブルにも適用されることに注意してください。