Explicit Two-Phase Commit (2PC)

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

X/Open Distributed Transaction Processing (DTP)モデルは、3つのソフトウェアコンポーネントを想定しています。

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

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

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

BDRは、 PREPARE TRANSACTION および COMMIT PREPARED/ROLLBACK PREPARED コマンドを使用した明示的な外部2PCをサポートしています。外部的には、 BDRクラスタは、単一のセッションのTransaction Managerにとって単一のResource Managerに見えます。

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

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

明示的な二相コミットは、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;