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

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

コミットスコープルールは、組み合わせて動作する1つ以上の操作で構成されます。ルール間でANDを使用します。

各オペレーションは、コミットスコープグループ、オプションの確認レベル、および独自のパラメーターを持つことができるコミットスコープの種類の2つまたは3つの部分で構成されています。

::

   commit_scope_group [ confirmation_level ] commit_scope_kind

完全な正式な構文図は、 `Commit scopes <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/commit-scopes/#commit-scope-syntax>`_ リファレンスで入手できます。

``MAJORITY ORIGIN GROUP QUORUM COMMIT ABORT ON (timeout = 6s)``
などの一般的なコミットスコープルールは、そのコンポーネントに分割できます。
``MAJORITY ORIGIN GROUP``
は、コミットスコープグループであり、どのノードが応答して、トランザクションを処理したことを確認する必要があるかを指定します。この例では、元のノードのグループ内のノードの大部分が確認する必要があります。

確認レベルが指定されていません。これは、デフォルト\ ``visible``
が使用されることを意味します。 ``visible``
を使用すると、ノードは、すべてのトランザクションの変更がディスクにフラッシュされ、他のトランザクションから可視されると確認します。

このオペレーションの最後の部分はコミットスコープの種類です。この例では
``QUORUM COMMIT`` です。 ``QUORUM COMMIT``
は、ノードがコミットする前にすべての参加ノードを調整する同期2フェーズコミットです。
``ABORT ON``
句は必須で、トランザクションを中止する前にクォーラムを待機する時間を設定します。

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

コミットスコープグループには、 ``ANY`` 、\ ``ALL``
、および\ ``MAJORITY``
の3種類があります。これらのすべての後には、かっこ内の1つ以上のグループのリストが続きます。グループのこのリストを組み合わせて、この操作が適用されるノードのプールを作成します。このリストには、\ ``NOT``
を付けることができます。これは、プールをリストにない他のすべてのグループに反転します。

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

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

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

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

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

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

上記の式はすべて、評価時にグループ内のデータノードのみを考慮します。
Witnessノードおよびその他の非データノードは無視されます。

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

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つのコミットスコープ種類があります。以下は概要と、詳細へのリンクです。

同期コミット
^^^^^^^^^^^^

同期コミットは、ネイティブのPostgres ``synchronous_commit``
オプションのように動作するように設計されたコミットスコープオプションですが、コミットスコープ環境内から使用できます。これは、オプションの\ ``DEGRADE ON``
句をサポートする同期非2フェーズコミットオペレーションです。このオプションの前にあるコミットスコープグループは、
``SYNCHRONOUS COMMIT`` が使用するグループと確認要件を制御します。

詳細については、 :ref:`Synchronous Commit <Synchronous Commit>` を参照してください。

クォーラムコミット
^^^^^^^^^^^^^^^^^^

クォーラムコミットは、ノードがコミットする前にすべての参加ノードを調整する同期2フェーズコミットです。すべての参加ノードは一緒にコミットまたはロールバックします。ノードがローカルにコミットできる前に、クォーラムコミットは熱心な競合解決を使用して、事実後解決するのではなく不一貫性を防止します。サポートされているコミットスコープグループは、\ ``ALL``
、\ ``MAJORITY ORIGIN GROUP`` 、\ ``MAJORITY CLUSTER``
、および\ ``MAJORITY FOR EACH GROUP`` です。

詳細については、 :ref:`How Quorum Commit works <How Quorum Commit works>` を参照してください。

CAMO
^^^^

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

詳細については、 :ref:`Commit At Most Once <Commit At Most Once>` を参照してください。

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

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

詳細については、 :ref:`Lag Control <Lag Control>` を参照してください。

..  Note Legacy commit scope kind::
   `GROUP COMMIT` は、下位互換性のために保持されている古いコミットスコープの種類です。新しい展開の場合、代わりに`QUORUM COMMIT` を使用してください。詳細については、 :ref:`Group Commit (legacy) <Group Commit (legacy)>` を参照してください。

.. ::
   ## 結合ルール

コミットスコープルールは、組み合わせて動作する1つ以上の操作で構成されます。
ANDを使用して1つのルールを形成します。例

::

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

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