Commit scopes
=============

コミットスコープは、PGDシステム内でトランザクションのコミットと競合を処理する方法を決定するルールです。それらの詳細については、
:ref:`コミットスコープへの移行 <コミットスコープへの移行>`  を参照してください。

次のファンクションを使用して、コミットスコープを操作できます。

- `bdr.create_commit_scope <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/functions#bdrcreate_commit_scope>`_ 

- `bdr.alter_commit_scope <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/functions#bdralter_commit_scope>`_ 

- `bdr.drop_commit_scope <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/functions#bdrdrop_commit_scope>`_ 

コミットスコープの構文
----------------------

コミットスコープルールの全体的な文法は次のように構成されます。

::

   commit_scope:
       commit_scope_operation [AND ...]

   commit_scope_operation:
       commit_scope_group confirmation_level commit_scope_kind

   commit_scope_target:
       { (node_group [, ...])
         | ORIGIN_GROUP }

   commit_scope_group:
   { ANY num [NOT] commit_scope_target
     | MAJORITY [NOT] commit_scope_target
     | ALL [NOT] commit_scope_target }

   confirmation_level:
       [ ON { received|replicated|durable|visible } ]

   commit_scope_kind:
   { GROUP COMMIT [ ( group_commit_parameter = value [, ... ] ) ] [ ABORT ON ( abort_on_parameter = value ) ] [ DEGRADE ON (degrade_on_parameter = value [, ... ] ) TO commit_scope_degrade_operation ]
     | QUORUM COMMIT [ ( commit_decision = { group | raft } ) ] ABORT ON ( timeout = value )
     | CAMO [ DEGRADE ON ( degrade_on_parameter = value [, ... ] ) TO ASYNC ]
     | LAG CONTROL [ ( lag_control_parameter = value [, ... ] ) ]
     | SYNCHRONOUS COMMIT [ DEGRADE ON (degrade_on_parameter = value ) TO commit_scope_degrade_operation ] }

   commit_scope_degrade_operation:
      commit_scope_group confirmation_level commit_scope_kind

``node_group`` は、PGDデータノードグループの名前です。

commit_scope_degrade_operation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``commit_scope_degrade_operation``
は、定義されるルール全体としてより制限の少ないコミットスコープグループと同じコミットスコープ種類であるか、非同期\ ``ASYNC``
のいずれかです。

例、 :ref:`Degrading commit scope rules <Degrading commit scope rules>`  ``ALL SYNCHRONOUS COMMIT``
から\ ``MAJORITY SYNCHRONOUS COMMIT``
、または\ ``MAJORITY SYNCHRONOUS COMMIT``
から\ ``ANY 3 SYNCHRONOUS COMMIT``
、または\ ``ANY 3 SYNCHRONOUS COMMIT``
から\ ``ANY 2 SYNCHRONOUS COMMIT`` 。 ``SYNCHRONOUS COMMIT``
から\ ``ASYNC``
に低下することもできます。ただし、関係するコミットスコープグループに関係なく、\ ``SYNCHRONOUS COMMIT``
から\ ``GROUP COMMIT`` またはその逆に低下することはできません。

``AND``
を使用して、それぞれが独自の低下句を持つルールを組み合わせることもできます。

::

   ALL ORIGIN GROUP SYNCHRONOUS COMMIT DEGRADE ON (timeout = 10s) TO MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT AND ANY 1 NOT ORIGIN GROUP SYNCHRONOUS COMMIT DEGRADE ON (timeout = 20s) TO ASYNC

コミットスコープターゲット
--------------------------

ORIGIN_GROUP
^^^^^^^^^^^^

特定のグループをターゲットとする代わりに、トランザクションが発生する最下位グループを動的に参照する\ ``ORIGIN_GROUP``
を使用することもできます。したがって、トップレベルグループ\ ``top_group``
と、子として2つのサブグループ\ ``left_dc`` および\ ``right_dc``
がある場合、次のようなコミットスコープを追加します。

.. code:: sql

   SELECT bdr.create_commit_scope(
       commit_scope_name := example_scope,
       origin_node_group := top_level_group,
       rule := MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT,
       wait_for_ready := true
   );

``left_dc`` のノードで発生したトランザクションの場合、 ``left_dc``
のノードの大部分は、トランザクションがコミットされる前に同期的に確認する必要があることを意味します。さらに、同じルールは、
``right_dc`` のノードから発生したトランザクションの場合、 ``right_dc``
のノードの大部分が、コミットされる前にトランザクションを同期的に確認する必要があることも意味します。これにより、\ ``left_dc``
用と\ ``right_dc``
用の2つの別個のルールをコミットスコープに追加する必要がなくなります。

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

任意
^^^^

例 ``ANY 2 (left_dc)``

このコミットスコープグループのトランザクションは、 ``left_dc``
グループ内の2つのノードがトランザクションを処理したことを確認した後、コミットされたとみなされます。

ANY NOT
^^^^^^^

例 ``ANY 2 NOT (left_dc)``

``left_dc``
グループにない2つのノードがトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

マジョリティ
^^^^^^^^^^^^

例 ``MAJORITY (left_dc)``

``left_dc``
グループ内のノードの大部分がトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

マジョリティではない
^^^^^^^^^^^^^^^^^^^^

例 ``MAJORITY NOT (left_dc)``

``left_dc``
グループにないノードの大部分がトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

すべて
^^^^^^

例 ``ALL (left_dc)``

``left_dc``
グループ内のすべてのノードがトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

``ALL``
を :ref:`Group Commit (legacy) <Group Commit (legacy)>` とともに使用する場合、リコンシリエーションの問題を回避するには、
:ref:`bdr.commit_Decisions <bdr.commit_Decisions>` 設定を\ ``raft`` に設定する必要があります。

すべてではない
^^^^^^^^^^^^^^

例 ``ALL NOT (left_dc)``

``left_dc``
グループにないすべてのノードがトランザクションを処理したことを確認した場合、このコミットスコープグループのトランザクションはコミットされたとみなされます。

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

確認レベルは、リモートPGDノードがトランザクションの処理中に特定のポイントに到達したことを確認する時点を設定します。
``QUORUM COMMIT`` は、\ ``durable`` および\ ``visible``
のみをサポートしています。

ONを受信しました
^^^^^^^^^^^^^^^^

トランザクションは、ローカルアプリケーションを開始する前に、受信後すぐに確認されます。

ONが複製されました
^^^^^^^^^^^^^^^^^^

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

ON耐久性
^^^^^^^^

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

ON可視
^^^^^^

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

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

コミットスコープの種類の詳細とそのパラメーターの詳細

- :ref:`Synchronous Commit <Synchronous Commit>` 

- :ref:`How Quorum Commit works <How Quorum Commit works>` 

- :ref:`CAMO (Commit At Most Once) <Commit At Most Once>` 

- :ref:`Lag Control <Lag Control>` 

- :ref:`Group Commit (legacy) <Group Commit (legacy)>` 

..  Note Parameter values::
   
`Postgres GUC parameter value conventions <https://www.postgresql.org/docs/current/config-setting.html#CONFIG-SETTING-NAMES-VALUES>`_ を使用して、 Boolean、enum、int、およびinterval値を指定します。

.. ::
   ## 同期コミット

::

   SYNCHRONOUS COMMIT [ DEGRADE ON (degrade_on_parameter = value ) TO commit_scope_degrade_operation ]

DEGRADE ONパラメーター
^^^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `timeout`,interval,0,ミリ秒単位のタイムアウト他の単位を受け入れます。その後、オペレーションが低下します。 0は設定されていないことを意味します。
  `require_write_lead`,Boolean,False,ノードが縮退動作に切り替えることができるように書き込みリードである必要があるかどうかを指定します。

これらは、コミットスコープルールがより制限の低いオペレーションモードに低下する条件を設定します。

.. _commit_scope_degrade_operation-1:

commit_scope_degrade_operation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``commit_scope_degrade_operation``
は、より制限の少ないコミットスコープグループの\ ``SYNCHRONOUS COMMIT``
であるか、非同期\ ``ASYNC`` である必要があります。

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

ノードがコミットする前に、すべての参加ノードにわたってコミット決定を調整することにより、分散トランザクションの一貫性を提供します。

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

::

   QUORUM COMMIT [ ( commit_decision = { group | raft } ) ] ABORT ON ( timeout = value )

サポートされているコミットスコープグループは、\ ``ALL``
、\ ``MAJORITY ORIGIN GROUP`` 、\ ``MAJORITY CLUSTER``
、および\ ``MAJORITY FOR EACH GROUP``
です。明示的なグループリストを使用した\ ``MAJORITY`` 、 ``ANY n``
、および\ ``NOT`` はサポートされていません。

``QUORUM COMMIT`` では、 ``durable`` および\ ``visible``
確認レベルのみがサポートされています。 ``received``
または\ ``replicated`` を使用するとエラーになります。

QUORUM COMMITパラメーター
^^^^^^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `commit_decision`,enum,group,コミットの決定がどのように行われるかを指定します。 `group` I `raft` 。  :ref:`commit_決める設定<commit_決める設定>` を参照してください。

QUORUM COMMIT ABORT ONパラメーター
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``ABORT ON`` は、クォーラムコミットには必須です。

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `timeout`,interval,0,アボートする前にクォーラムを待機する時間。 0は設定されていないことを意味します。

commit_決める設定
^^^^^^^^^^^^^^^^^

値\ ``group``
は、オリジンノードがコミットスコープグループから必要な確認を受信すると、コミットすることを決定することを意味します。

値\ ``raft``
は、コミット決定がPGDのビルトインRaftコンセンサスを介して行われることを意味します。これは\ ``group``
より遅いですが、特定のマルチグループトポロジで必要になる場合があります。

CAMO
----

クライアントの協力により、フェールオーバーシナリオで同じトランザクションの複数の挿入を防止する保護を有効にします。

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

::

   CAMO [ DEGRADE ON ( degrade_on_parameter = value ) TO ASYNC ]

.. _degrade-onパラメーター-1:

DEGRADE ONパラメーター
^^^^^^^^^^^^^^^^^^^^^^

タイムアウト時に非同期操作に低下することを許可します。

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `timeout`,interval,0,ミリ秒単位のタイムアウト他の単位を受け入れますこの後、操作は非同期になります。 0は設定されていないことを意味します。
  `require_write_lead`,Boolean,False,ノードが非同期モードに切り替えることができるように書き込みリードである必要があるかどうかを指定します。

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

レプリケーションラグによって制御される動的なレート制限の構成が可能になります。

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

::

   LAG CONTROL [ ( lag_control_parameter = value [, ... ] ) ]

LAG CONTROLパラメーター
^^^^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `max_lag_size`,int,0,特定のノードが別のノードへのレプリケーション接続で持つことができるKB単位の最大遅延。遅延が`max_commit_delay`によってスケールされたこの最大値を超えると、遅延制御はコミット遅延を調整します。
  `max_lag_time`,interval,0,特定のダウンストリームノードへのレプリケーション接続に関して、特定のオリジンが持つことができるミリ秒単位の最大レプリケーションラグ。
  `max_commit_delay`,interval,0,各コミットにかかる最大遅延をミリ秒の小数単位で構成します。 0に設定すると、Lag Controlが無効になります。各コミット遅延調整の後たとえば、レプリケーションが`max_lag_size`または`max_lag_time`よりも遅延している場合、コミット遅延は`bdr.lag_control_commit_delay_adjust` GUCの重みで再計算されます。 `max_commit_delay`は、コミット遅延の上限です。

- ``max_lag_size`` および\ ``max_lag_time`` が0に設定されている場合、LAG
  CONTROLは無効になります。

- ``max_commit_delay`` が設定されていないか、0に設定されている場合、LAG
  CONTROLは無効になります。

遅延サイズは、walsenderの\ ``send_ptr`` から受信者の\ ``apply_ptr``
までのデルタから導き出されます。

遅延時間は次の式に従って計算されます。

::

     lag_time = (lag_size / apply_rate) * 1000;

``lag_size`` は、\ ``send_ptr`` と\ ``apply_ptr`` ``max_lag_size``
に使用されるデルタであり、 ``apply_rate``
は、単純化された式に従う加重指数移動平均です。

::

     apply_rate = prev_apply_rate * (1 - apply_rate_weight) +
                   ((apply_ptr_diff * apply_rate_weight) / diff_secs);

そこで

- ``prev_apply_rate``
  は、新しいレートを再計算する前に、以前に構成された\ ``apply_rate``
  でした。

- ``apply_rate_weight`` は、GUC ``bdr.lag_tracker_apply_rate_weight``
  の値です。

- ``apply_ptr_diff`` は、現在の\ ``apply_ptr``
  と、適用レートが最後に計算された時点での\ ``apply_ptr`` の差です。

- ``diff_secs``
  は、最後に適用レートが計算されてからの秒単位のデルタです。

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

ノードのコンセンサスによってコミットを確認でき、競合解決設定を制御し、
:ref:`Synchronous Commit <Synchronous Commit>`  と同様に、オプションのルール低下パラメーターがあります。

::

   GROUP COMMIT [ ( group_commit_parameter = value [, ...] ) ] [ ABORT ON ( abort_on_parameter = value ) ] [ DEGRADE ON (degrade_on_parameter = value ) TO commit_scope_degrade_operation ]

GROUP COMMITパラメーター
^^^^^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `transaction_tracking`,Boolean,Off/False,トランザクションのステータスを追跡するかどうかを指定します。  :ref:`transaction_tracking設定<transaction_tracking設定>` を参照してください。
  `conflict_resolution`,enum,async,競合を処理する方法を指定します。 `async`I`eager` 。  :ref:`fence_resolution設定<fence_resolution設定>` を参照してください。
  `commit_decision`,enum,group,COMMIT決定を行う方法を指定します。 `group`I`partner`I`raft` 。  :ref:`commit_決める設定<commit_決める設定>` を参照してください。

ABORT ONパラメーター
^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `timeout`,interval,0,ミリ秒単位のタイムアウト他の単位を受け入れます。 0は設定されていないことを意味します。
  `require_write_lead`,Boolean,False,CAMOのみ。設定されている場合、トランザクションをローカル非同期モードに切り替えるには、コンセンサス要求が必要です。

.. _degrade-onパラメーター-2:

DEGRADE ONパラメーター
^^^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Parameter,Type,Default,Description
  :widths: 15,12,12,20
  :align: left
  :class: longtable

  `timeout`,interval,0,ミリ秒単位のタイムアウト他の単位を受け入れます。その後、オペレーションが低下します。 0は設定されていないことを意味します。
  `require_write_lead`,Boolean,False,ノードが縮退動作に切り替えることができるように書き込みリードである必要があるかどうかを指定します。

transaction_tracking設定
^^^^^^^^^^^^^^^^^^^^^^^^

trueに設定されている場合、2フェーズコミットトランザクション

- ライタがPREPAREメッセージを処理しているときにコミット決定をルックアップします。

- 中断から回復するときは、中断前に準備されたトランザクションを検索します。見つかると、トランザクションのコミットスコープと、対応するRAFTコミット決定を検索します。ノードがトランザクションのオリジンであり、RAFTコミット決定がなく、コミットスコープで\ ``transaction_tracking``
  がオンであると仮定します。その場合、コミットまたは中止されるまで、この未解決のトランザクションのRAFTコミット決定を定期的に検索します。

fence_resolution設定
^^^^^^^^^^^^^^^^^^^^

値\ ``async``
は、レプリケーション中に競合解決ポリシーを使用して競合を非同期的に解決することを意味します。

値\ ``eager`` は、
COMMIT中に、競合するトランザクションのいずれかがアボートすることにより、競合が熱心に解決されることを意味します。

Eagerは、 ``MAJORITY`` または\ ``ALL``
コミットスコープグループでのみ使用できます。

``ALL``
コミットスコープグループで使用する場合、リコンシレーションの問題を回避するには、
:ref:`bdr.commit_Decisions <bdr.commit_Decisions>` を\ ``raft`` に設定する必要があります。

:ref:`欠落列の競合の解決 <欠落列の競合の解決>` を参照してください。

GROUP COMMIT commit_決断設定
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

値\ ``group`` は、前述の\ ``commit_scope_group``
仕様が耐久性だけでなくCOMMIT決定にも影響を与えることを意味します。

値\ ``partner``
は、パートナーノードがトランザクションをコミットできるかどうかを決定することを意味します。この値は、2つのデータノードを持つグループでのみ許可されます。

値\ ``raft``
は、決定がPGDのビルトインRaftコンセンサスを利用することを意味します。選択したコミットスコープグループのすべてのノードがトランザクションを確認したら、PGDクラスター内のすべてのノードがトランザクションを記録したことを確認するために、全ノードのRaftで記録されます。

``ALL``
コミットスコープグループが使用されている場合、このオプションは使用して、決定を巡ってノード間で相違がないことを保証する必要があります。このオプションはパフォーマンスが低い場合があります。

:ref:`決定をコミットする <決定をコミットする>` を参照してください。

commit_scope_degrade_operation設定
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``commit_scope_degrade_operation``
は、より制限の少ないコミットスコープグループの\ ``GROUP_COMMIT``
であるか、非同期\ ``ASYNC`` である必要があります。
