Explicit two-phase commit (2PC)
===============================

..  Note::
   2フェーズコミットは、 Quorum Commit、 Group Commit、またはCAMOでは使用できません。 :ref:`Commit scope limitations <Overview of durability options>`  を参照してください。

.. ::
   アプリケーションは、PGDで2フェーズコミットを使用することを明示的に選択できます。 `Distributed Transaction Processing: The XA Specification <http://pubs.opengroup.org/onlinepubs/009680699/toc.pdf>`_ を参照してください。

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フェーズコミットを使用するため、明示的な2フェーズコミットはQuorum
Commit、Group
Commit、またはCAMOでは機能しません。明示的な2フェーズコミットは、
:ref:`Parallel Apply <Parallel Apply>` または :ref:`トランザクションストリーミングでの使用 <トランザクションストリーミングでの使用>` でもうまく機能しません。明示的な2フェーズコミットを使用する前に、両方を無効にします。

使用する
--------

ローカルコミットスコープの2フェーズコミットは、標準のPostgreSQLとまったく同じように動作します。ローカルコミットスコープを使用します。

.. code:: sql

   BEGIN;
   SET LOCAL bdr.commit_scope = local;

   ... other commands possible...

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

.. code:: sql

   PREPARE TRANSACTION some-global-id;

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

.. code:: sql

   COMMIT PREPARED some-global-id;
