Explicit two-phase commit (2PC)¶
アプリケーションは、 BDRで2フェーズコミットを使用することを明示的に選択できます。
X/Open Distributed Transaction Processing (DTP) モデルは、次の3つのソフトウェアコンポーネントを想定しています。
トランザクションの境界を定義し、トランザクションを構成するアクションを指定するアプリケーションプログラム(AP)
共有リソースへのアクセスを提供するリソースマネージャー(データベースやファイルアクセスシステムなどのRM)
トランザクションに識別子を割り当て、その進行状況を監視し、トランザクションの完了と障害回復に責任を持つトランザクションマネージャー(TM)と呼ばれる別個のコンポーネント
BDRは、 PREPARE TRANSACTION およびCOMMIT PREPARED
/ROLLBACK PREPARED
コマンドを使用した明示的な外部2PCをサポートしています。外部的には、 EDB
Postgres分散クラスターは、単一のセッションのトランザクションマネージャーに単一のリソースマネージャーに見えます。
bdr.commit_scope がlocal
の場合、ローカルノードのみでトランザクションを準備します。コミットされると、変更がレプリケートされ、
BDRはコミット後の競合解決を適用します。
bdr.commit_scope をlocal
に設定して使用することは、明示的な2フェーズコミットでは意味がないように見えるかもしれませんが、トランザクションのレイテンシーと堅牢性の間のトレードオフを制御できるようにするオプションが提供されています。
明示的な2フェーズコミットは、 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;