Explicit Two-Phase Commit (2PC)

アプリケーションは、 BDRで明示的に二相コミットを使用することを選択できます。 SeeDistributed Transaction Processing: The XA Specification。

X / Open分散トランザクション処理(DTP)モデルは、3つのソフトウェアコンポーネントを想定しています。

  • トランザクション境界を定義し、指定するアプリケーションプログラム(AP) トランザクションを構成するアクション。

  • 提供するリソースマネージャー(RM、データベースやファイルアクセスシステムなど) 共有リソースへのアクセス。

  • 識別子を割り当てるトランザクションマネージャ(TM)と呼ばれる別のコンポーネント トランザクションの進行状況を監視し、 トランザクション完了および障害リカバリ用。

BDRは、PREPARE TRANSACTIONおよびCOMMIT PREPARED / ROLLBACK PREPAREDコマンドを使用して、明示的な外部2PCをサポートします。外部では、 BDRクラスターは、単一セッションのトランザクションマネージャーに対して単一のリソースマネージャーのように見えます。

bdr.commit_scopeがlocalの場合、トランザクションはローカルノードでのみ準備されます。コミットされると、変更が複製され、BDRはコミット後の競合解決を適用します。

localに設定されたbdr.commit_scopeの使用は、明示二相コミットでは無意味に思えるかもしれませんが、ユーザーがトランザクションのレイテンシと堅牢性の間のトレードオフを制御できるオプションが提供されます。

明示的な二相コミットは、CAMOまたはグローバルコミットスコープと組み合わせて機能しません。将来のリリースでは、この組み合わせが有効になる可能性があります。

使用法

ローカルコミットスコープを持つ2フェーズコミットは、標準のPostgreSQLとまったく同じように機能します。ローカルコミットスコープを使用して、CAMOを無効にしてください。

BEGIN;

SET LOCAL bdr.enable_camo = 'off';
SET LOCAL bdr.commit_scope = 'local';

... other commands possible...

コミットの最初のフェーズをスタートするには、クライアントはグローバルトランザクションIDを割り当てる必要があります。これは、トランザクションを識別する一意の文字列にすることができます。

PREPARE TRANSACTION 'some-global-id';

最初のフェーズが成功すると、すべてのノードが変更を適用し、トランザクションをコミットする準備が整います。次に、クライアントは同じノードから2番目のフェーズを呼び出す必要があります。

COMMIT PREPARED 'some-global-id';