Commit scope rules
==================

コミットスコープルールは、コミットスコープメカニズムの中核です。これらは、コミットスコープが適用する内容を定義します。

コミットスコープルールは、 ``AND``
と組み合わせた1つ以上の操作で構成されます。

各オペレーションは、2つまたは3つの部分、コミットスコープグループ、オプションの確認レベル、およびコミットスコープの種類独自のパラメーターを持つ場合があります。

::

   commit_scope_group [ confimation_level ] commit_scope_kind

完全な形式的な構文図は、 :ref:`commit scope reference section. <Commit scopes>` で利用できます。

典型的なコミットスコープルールを見て、そのコンポーネントに分割できます。

::

   ANY 2 (group) GROUP COMMIT

``ANY 2 (group)``
はコミットスコープグループであり、ルールにどのノードが応答する必要があるかを指定し、トランザクションを処理したことを確認します。特に、ここでは、名前付けグループの任意の2つのノードが確認する必要があります。

ここには確認レベルはありませんが、それはデフォルトが使用されることを意味します。ルール全体を次のように考えることができます。

::

   ANY 2 (group) ON visible GROUP COMMIT

可視設定は、すべてのトランザクションの変更がディスクにフラッシュされ、他のトランザクションから可視されると、ノードが確認できることを意味します。

この操作の最後の部分はコミットスコープの種類であり、ここでは\ ``GROUP COMMIT``
であり、名前付けグループ内の2つのノードがトランザクションの変更をフラッシュして可視化したことを確認したときに確認される同期2フェーズコミットです。

コミットスコープグループ
------------------------

コミットスコープグループには、 ``ANY`` 、\ ``ALL`` 、\ ``MAJORITY``
の3種類があります。これらはすべて、1つ以上のグループのかっこで囲まれたリストが続きます。これらを組み合わせて、この操作が適用されるノードのプールを作成します。このリストには、リストにあるもの以外の他のすべてのグループにプールするように反転する\ ``NOT``
を付けることができます。
Witnessノードはデータを複製しないため、このプールに含める資格がありません。

-  ``ANY n``
   —その後に整数値「n」が続きます。これは、リストされたグループノードの任意の「n」ノードに変換されます。

-  ``ALL``
   —後にはグループが続き、リストされたグループノード内のすべてのノードに変換されます。

-  ``MAJORITY``
   —後にグループが続き、マジョリティを与えるために確認するためにリストされたグループノードの半分と1を必要とすることを意味します。

-  ``ANY n NOT``
   —その後に整数値「n」が続きます。これは、リストされたグループノードにない「n」ノードに変換されます。

-  ``ALL NOT``
   —後にはグループが続き、リストされたグループのノードにないすべてのノードに変換されます。

-  ``MAJORITY NOT``
   —後にグループが続き、マジョリティを与えるために確認するためにリストされたグループノードにないノードの半分と1を必要とすることを意味します。

確認レベル
----------

PGDノードは、さまざまなタイミングでトランザクションの確認を送信できます。保護レベルが増加すると、確認ノードの観点から、これらは次のとおりです。

-  ``received``
   —リモートPGDノードは、トランザクションを受信したらすぐに、ローカルアプリケーションを開始する前に確認します。

-  ``replicated``
   —トランザクションの変更を適用した後、ディスクにフラッシュする前に確認します。

-  ``durable``
   —すべての変更がディスクにフラッシュされた後、トランザクションを確認します。

-  ``visible``
   デフォルトすべての変更がディスクにフラッシュされ、同時トランザクションに可視された後、トランザクションを確認します。

コミットスコープのルールでは、これらの確認レベルを次のように\ ``ON``
のかっこ内のノードグループ定義に追加できます。

-  ``ANY 2 (right_dc) ON replicated``

-  ``ALL (left_dc) ON visible`` デフォルト

-  ``ALL (left_dc) ON received AND ANY 1 (right_dc) ON durable``

..  Note::
   Postgresqlの`synchronous_standby_names` 機能に精通している場合、 `synchronous_standby_names` とコミットスコープの文法は似ているように見えますが、微妙な違いがあることに注意してください。前者は起点ノードを考慮しませんが、後者は考慮します。たとえば、 `synchronous_standby_names = 'ANY 1 (..)'` は、`ANY 2 (...)` のコミットスコープと同等です。この違いにより、マジョリティに関する推論が簡単になり、起点ノードがトランザクションの耐久性と可視性にも貢献することを反映しています。 !!!

コミットスコープの種類
----------------------

現在、4つのコミットスコープ種類があります。それぞれに独自のページがあるため、ここにそれらを要約してリンクします。

グループコミット
^^^^^^^^^^^^^^^^

グループコミットは、コミットスコープグループの要件に従って確認される同期2フェーズコミットです。
``GROUP COMMIT``
には、割り込みでトランザクションを追跡するかどうかブール値、デフォルトでoff、競合を解決する方法\ ``async``
または\ ``eager`` 、デフォルトで\ ``async``
、およびコンセンサスを取得する方法\ ``group`` 、\ ``partner``
または\ ``raft`` 、デフォルトは\ ``group`` です)。

詳細については、 :ref:`グループコミット <グループコミット>` を参照してください。

CAMO
^^^^

Camo、 Commit At Most
Onceは、クライアント/アプリケーション、オリジンノード、およびパートナーノードが使用できるように、トランザクションが最大1回データベースにコミットされるようにします。クライアントはプロセスに関係するため、
CAMOプロセスに参加するにはアプリケーションを変更する必要があります。

詳細については、 :ref:`CAMOまたはコミット・アット・モスト・ワンス <CAMOまたはコミット・アット・モスト・ワンス>` を参照してください。

ラグコントロール
^^^^^^^^^^^^^^^^

ラグ制御を使用すると、システムのレプリケーションパフォーマンスが指定された制限を超えると、データベースとのクライアントの相互作用にコミット遅延を自動的に挿入し、クライアントにバックプレッシャーを提供できます。ラグ制御には、適用できる最大コミット遅延を設定するパラメーターと、そのコミット遅延の増加をトリガーする処理時間またはキューサイズの観点からの制限があります。

詳細は :ref:`遅延制御 <遅延制御>` を参照してください。

SYNCHRONOUS_COMMIT
^^^^^^^^^^^^^^^^^^

同期コミットは、古い\ ``synchronous_commit``
オプションのように設計されたコミットスコープオプションですが、コミットスコープ環境内でアクセスできます。
``GROUP COMMIT``
とは異なり、これは同期非2フェーズコミットオペレーションであり、パラメーターはありません。前述のコミットスコープグループは、\ ``SYNCHRONOUS_COMMIT``
が使用するグループと確認要件を制御します。

詳細はこちら :ref:`SYNCHRONOUS_COMMIT <SYNCHRONOUS_COMMIT>` 

結合ルール
----------

ルールには複数の操作を含めることができ、\ ``AND``
と組み合わせて単一のルールを形成します。例

::

   MAJORITY (Region_A) SYNCHRONOUS_COMMIT AND ANY 1 (Region_A) LAG CONTROL (MAX_LAG_SIZE = 50MB)

最初のオペレーションは\ ``Region_A``
の大部分に対する同期コミットをセットアップし、2番目のオペレーションは\ ``Region_A``
のノードのいずれかが50MBを超える遅延があるときにコミット遅延の押し上げを開始する遅延制御を追加します。この操作の組み合わせにより、ノードに遅延が発生しているときに遅延制御が動作できます。
