Group Commit
============

グループコミットの目標は、単一ノードの障害または一時的な停止が発生した場合のデータの損失から保護することです。これは、複数のPGDノードがCOMMIT時にトランザクションを正常に受信および確認する必要があることにより実現します。

要件
----

通常のオペレーションでは、グループコミットはアプリケーションに対して透過的です。フェールオーバー中に進行していたトランザクションには、アプリケーションまたは間のプロキシによってトリガーまたは統合される調整フェーズが必要です。このアクティビティは現在、元のノードが復旧した場合、またはクラスターから分離された場合にのみ発生します。この動作は、Postgresの古いビルトイン同期レプリケーションの場合と同じです。

グループコミットでコミットされたトランザクションは、その下で2フェーズコミットを使用します。したがって、ノードごとに発生するこのようなすべてのトランザクションを処理できるように十分に高い\ ``max_prepared_transactions``
を構成します。

構成
----

グループコミットを使用するには、最初に :ref:`コミットスコープ <コミットスコープ>` 
を定義します。コミットスコープは、トランザクションのコミットに関係するPGDノードを決定します。

動作
----

Group
Commitの動作は、コミットスコープによって適用される構成によって異なります。

決定をコミットする
^^^^^^^^^^^^^^^^^^

``group`` 、\ ``partner`` 、および\ ``raft``
の3つの方法でコミットを決定するようにグループコミットを構成できます。

グループコミットの決定は、耐久性の目的で使用されるのと同じコミットスコープグループ設定を使用して指定されたコンセンサスを通じて行われます。違いは、コミットの決定がPREPAREレプリケーションに基づいて行われるのに対し、耐久性はCOMMIT
(PREPARED)レプリケーションをチェックすることです。

パートナー決定は、
 :ref:`Commit At Most Once <Commit At Most Once>` が使用するものです。このアプローチは、ノードグループに2つのデータノードが存在する場合にのみ機能します。これらの2つのノードはお互いのパートナーであり、オリジンではなくレプリカが何かをコミットするかどうかを決定します。このアプローチでは、アプリケーションが何らかの形でコンセンサスの一部であるため、
CAMOトランザクションプロトコルを使用して正常に動作するには、アプリケーションの変更が必要です。このアプローチの詳細については、
 :ref:`CAMOまたはコミット・アット・モスト・ワンス <CAMOまたはコミット・アット・モスト・ワンス>`  を参照してください。

raftオプションは、ビルトインのRaftコンセンサスを使用して、コミットが発生できるかどうかを決定します。現在、グローバルRaftが使用されています。これが機能するには、クラスター全体のノードの大部分が動作している必要があります。

競合の解決
^^^^^^^^^^

競合の解決は\ ``async`` または\ ``eager`` です。

非同期とは、PGDが、特定のノードに構成されている行レベルの解決を使用して、レプリケーション中にオプティミスティック競合解決を行うことを意味します。これは、元のトランザクションがコミットされたか、まだ進行中であるかに関係なく発生します。非同期競合解決の仕組みの詳細については、
 :ref:`競合 <競合>` を参照してください。

Eagerとは、競合がCOMMIT契約の一部として熱心に解決され、競合するトランザクションがシリアル化エラーで中止されることを意味します。このアプローチは、パフォーマンスを犠牲にして非同期解決よりも高い分離を提供します。
Eager競合解決の仕組みの詳細については、
 :ref:`Eager conflict resolution <Eager conflict resolution>` を参照してください。

アボート
^^^^^^^^

COMMITでコンセンサスを取得できないトランザクションが永久にハングしないように、
``ABORT ON``
句でタイムアウトを指定できます。タイムアウトの後、トランザクションのアボートが要求されます。アボート要求が送信されたときにトランザクションがコミットされることが既に決定されている場合、クライアントがアボートメッセージを受信する場合でも、トランザクションは最終的にCOMMITします。

制限事項
--------

グループコミットトランザクションはまだDDLを実行できず、明示的な2フェーズコミットをサポートしていません。将来のリリースでは許可される可能性があります。ただし、
``TRUNCATE`` コマンドは許可されます。

CAMOトランザクションのみを\ ``DEGRADE TO``
句と組み合わせて、可用性が低下した場合に非同期オペレーションに切り替えることができます。

EagerおよびCAMOトランザクションは、デコードワーカー機能またはトランザクションストリーミングとの組み合わせで現在サポートされていません。
Eagerを使用したインストールでは、
PGDノードグループの\ ``enable_wal_decoder`` および\ ``streaming_mode``
を無効のままにする必要があります。

同期レプリケーションは、グループコミットとは異なるトランザクション確認のメカニズムを使用します。この2つは互換性がないため、一緒に使用しないでください。したがって、トランザクションをグループコミットするときは常に、
``synchronous_standby_names``
でPGDノードが構成されていないことを確認してください。

現在、Raftのコミット決定は非常に遅く、非常に低いTPSを生成します。
``eager`` 競合解決設定でのみこれらを使用して、PGD 4以前のEager All-Node
Replication動作を取得することをお勧めします。

同じトランザクションでのさまざまなコミット決定オプションの組み合わせは、サポートされていません。同じトランザクションで異なる競合解決オプションを組み合わせることもサポートされていません。
