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

コミットスコープにより、アプリケーションはEDB Postgres
Distributedの耐久性と一貫性に関する詳細な制御を提供します。

コミットスコープは、トランザクションがコミットされるときのシステムの動作を記述する一連のルールです。実際の動作は、コミットスコープのルールがどの種類のコミットスコープを使用するかによって異なります
:ref:`Synchronous Commit <Synchronous Commit>`  、 :ref:`How Quorum Commit works <How Quorum Commit works>`  、 :ref:`Commit At Most Once <Commit At Most Once>`  、 :ref:`Lag Control <Lag Control>` 
、またはこれらの組み合わせを使用します。

ほとんどのコミットスコープの種類はトランザクションの処理を制御しますが、Lag
Controlは例外で、遅いまたはキューアップされているレプリケーション操作に応じてシステムのパフォーマンスを動的に調整します。ただし、通常は他のコミットスコープ種類と組み合わせて使用されます

コミットスコープ構造
--------------------

すべてのコミットスコープには名前\ ``commit_scope_name`` があります。

各コミットスコープには1つ以上のルールがあります。

コミットスコープ内の各ルールには、コミットスコープルールを一意に識別する\ ``origin_node_group``
があります。

``origin_node_group``
はPGDグループであり、トランザクションのオリジネーターであるときにこのルールを適用するノードを定義します。

最後に、これらのトランザクションに適用されるコミットスコープまたはコミットスコープ種類の組み合わせを定義するルールがあります。

したがって、コミットスコープに次のルールがある場合

origin_node_group := ‘example_bdr_group’、rule := ‘MAJORITY ORIGIN GROUP
SYNCHRONOUS COMMIT’,

次に、ルールは、\ ``example_bdr_group``
のノードがトランザクションを発行したときに適用されます。

ルール自分自身は、変更を確認するために指定されたグループのノードの数を指定します。
``MAJORITY ORIGIN GROUP``
はコミットスコープグループであり、\ ``SYNCHRONOUS COMMIT``
はコミットスコープの種類です。これは、変更がコミットされたと見なされる前に、元のノードのグループ内のノードの大部分が変更を確認する必要があることを意味します。

コミットスコープの選択方法
--------------------------

変更が発生すると、
PGDはトランザクションまたはノードに使用するコミットスコープを検索します。

トランザクションがコミットスコープを指定している場合、そのスコープが使用されます。

指定しない場合、システムはデフォルトのコミットスコープを検索します。デフォルトのコミットスコープはグループレベルの設定です。システムはグループツリーを参照します。ノードのグループを含むグループツリーの下部から始めて上へ、default_commit_scope設定が定義されているグループを検索します。このコミットスコープが使用されます。

default_commit_scopeが見つからない場合、ノードのGUC、
bdr.commit_scopeが使用されます。そして、それが設定されていないか、\ ``local``
に設定されている場合、コミットスコープは適用されず、PGDの非同期レプリケーションが使用されます。

コミットスコープルールは、元のノードのグループがルールの\ ``origin_node_group``
またはそのサブグループのいずれかである場合、トランザクションに適用されます。
PGDは、ノード自分のグループからグループツリーを昇順することにより一致を決定します。そのため、親またはトップレベルのグループで定義されたルールは、そのサブグループで発生したトランザクションにも適用されます。一致するルールがなく、スコープが\ ``local``
でない場合、トランザクションはPGDのデフォルトの非同期レプリケーションを使用します。

コミットスコープの作成
----------------------

``bdr.create_commit_scope``
を使用して、ルール例をコミットスコープに追加します。例

.. code:: sql

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

これにより、\ ``example_bdr_group``
から発生したトランザクションのルール\ ``MAJORITY ORIGIN GROUP SYNCHRONOUS COMMIT``
が\ ``example_scope`` と呼ばれるスコープに追加されます。

``example_scope``
に以前にルールが存在しなかった場合、このルールを追加するとスコープが存在します。

ルールが追加されるときは、origin_node_groupが既に存在する必要があります。そうしない場合、追加操作全体がエラーで破棄されます。

ルールが評価されます。ルールが存在しないグループを記載しているか、グループの設定がグループのノードの他の構成設定と互換性がない場合、警告が表示されますが、ルールは追加されます。

ルールが追加されると、コミットスコープが使用できるようになります。

``wait_for_ready``
は、ルールが関連するノードに追加されるまで、\ ``bdr.create_commit_scope()``
呼び出しをブロックするかどうかを制御します。設定はデフォルトでtrueであり、省略できます。

コミットスコープを使用する
--------------------------

この例のスコープを使用するには、トランザクション内で\ ``bdr.commit_scope``
を設定できます

.. code:: sql

   BEGIN;
   SET LOCAL bdr.commit_scope = example_scope;
   ...
   COMMIT;

トランザクションがデータを書き込む前に、コミットスコープを設定する必要があります。

``bdr.alter_node_group_option``
を使用して、グループまたはサブグループのデフォルトとしてコミットスコープを設定できます。

.. code:: sql

   SELECT bdr.alter_node_group_option(
     node_group_name := example_bdr_group,
     config_key := default_commit_scope,
     config_value := example_scope
   );

グループまたはサブグループのデフォルトを完全にクリアするには、
``default_commit_scope`` 値を\ ``local`` に設定します。

.. code:: sql

   SELECT bdr.alter_node_group_option(
     node_group_name := example_bdr_group,
     config_key := default_commit_scope,
     config_value := local
   );

PGD CLIを使用してこの変更を行うこともできます。

::

   pgd group example-bdr-group set-option default_commit_scope "example_scope"

また、PGD CLIを使用して値を\ ``local``
に設定することにより、デフォルトをクリアできます。

::

   pgd group example-bdr-group set-option default_commit_scope "local"

最後に、次を使用してノードのデフォルトのcommit_scopeを設定できます。

.. code:: sql

   SET bdr.commit_scope = example_scope;

PGDのデフォルトの非同期レプリケーションを使用するには、
``bdr.commit_scope`` から\ ``local`` を設定します。
