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

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

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

-  :ref:`bdr.add_commit_scope <bdr.add_commit_scope>` 

-  :ref:`bdr.alter_commit_scope <bdr.alter_commit_scope>` 

-  :ref:`bdr.remove_commit_scope <bdr.remove_commit_scope>` 

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

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

::

   commit_scope:
       commit_scope_operation [AND ...]

   commit_scope_operation:
       commit_scope_group confirmation_level commit_scope_kind

   commit_scope_group:
   { ANY num [NOT] (node_group [, ...])
     | MAJORITY [NOT] (node_group [, ...])
     | ALL [NOT] (node_group [, ...]) }

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

   commit_scope_kind:
   { GROUP COMMIT [ ( group_commit_parameter = value [, ...] ) ] [ ABORT ON ( abort_on_parameter = value ) ]
     | CAMO [ DEGRADE ON ( degrade_on_parameter = value ) TO ASYNC ]
     | LAG CONTROL [ ( lag_control_parameter = value [, ... ] ) ] 
     | SYNCHRONOUS_COMMIT }

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

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

任意
^^^^

例 ``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:`グループコミット <グループコミット>` とともに使用する場合、リコンシリエーションの問題を回避するには、 :ref:`commit_決める設定 <commit_決める設定>` 設定を\ ``raft`` に設定する必要があります。

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

例 ``ALL NOT (left_dc)``

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

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

確認レベルは、リモートPGDノードがトランザクションの処理中に特定のポイントに到達したことを確認する時点を設定します。

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

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

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

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

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

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

ON可視
^^^^^^

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

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

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

-  :ref:`グループコミット <グループコミット>` 

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

-  :ref:`遅延制御 <遅延制御>` 

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

..  Note Parameter values ::
   :ref:`Postgres GUC parameter value conventions <Monitoring through SQL>` を使用して、 Boolean、enum、int、およびinterval値を指定します。 !!!

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

ノードのコンセンサスによってコミットを確認でき、競合解決設定を制御します。

::

   GROUP COMMIT [ ( group_commit_parameter = value [, ...] ) ] [ ABORT ON ( abort_on_parameter = value ) ]

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`,bool,false,CAMOのみ。設定されている場合、トランザクションをローカル非同期モードに切り替えるには、コンセンサス要求が必要です。

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

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

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

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

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

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

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

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

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

:ref:`列レベルの競合解決の有効化と無効化 <列レベルの競合解決の有効化と無効化>` を参照してください。

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

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

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

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

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

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

CAMO
----

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

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

::

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

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_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`` は、最後に適用レートが計算されてからの秒単位のデルタです。

SYNCHRONOUS_COMMIT
------------------

::

   SYNCHRONOUS_COMMIT

``SYNCHRONOUS_COMMIT``
コミットスコープ種類にはパラメーターがありません。これは、コミットスコープグループとコミットスコープの可視性によってのみ効果的に構成されます。
