Explicit two-phase commit (2PC)#
注釈
2フェーズコミットは、 Group CommitまたはCAMOでは使用できません。 Commit scope limitations を参照してください。
アプリケーションは、PGDで2フェーズコミットを使用することを明示的に選択できます。 Distributed Transaction Processing: The XA Specification を参照してください。
X/Open分散トランザクション処理DTPモデルは、3つのソフトウェアコンポーネントを想定しています。
トランザクション境界を定義し、トランザクションを構成するアクションを指定するアプリケーションプログラムAP
共有リソースへのアクセスを提供するデータベースやファイルアクセスシステムなどのリソースマネージャーRM
トランザクションに識別子を割り当て、その進行状況を監視し、トランザクションの完了と障害からの回復に対して責任を負うトランザクションマネージャーTMと呼ばれる別のコンポーネント
PGDは、 PREPARE TRANSACTION およびCOMMIT PREPARED
/ROLLBACK PREPARED
コマンドを使用して明示的な外部2PCをサポートします。外部的には、 EDB
Postgres分散クラスターは、単一のセッションのトランザクションマネージャーに対する単一のリソースマネージャーであるように見えます。
bdr.commit_scope がlocal
の場合、トランザクションはローカルノードでのみ準備されます。コミットされると、変更がレプリケートされ、PGDがコミット後の競合解決を適用します。
明示的な2フェーズコミットでは、 local
に設定してbdr.commit_scope
を使用するのは意味がないと思われる場合があります。ただし、このオプションは、トランザクションのレイテンシーと堅牢性の間のトレードオフを制御できるように提供されています。
明示的な2フェーズコミットは、 CAMOまたはグローバルコミットスコープでは機能しません。将来のリリースでは、この組み合わせが有効になる可能性があります。
使用する#
ローカルコミットスコープの2フェーズコミットは、標準のPostgreSQLとまったく同じように動作します。ローカルコミットスコープを使用します。
BEGIN;
SET LOCAL bdr.commit_scope = local;
... other commands possible...
コミットの最初のフェーズを開始するには、クライアントはグローバルトランザクションIDを割り当てる必要があります。これは、トランザクションを識別する一意の文字列です。
PREPARE TRANSACTION some-global-id;
最初のフェーズが成功した後、すべてのノードが変更を適用し、トランザクションをコミットする準備が整います。次に、クライアントは同じノードから第2フェーズを呼び出す必要があります。
COMMIT PREPARED some-global-id;