Limitations
===========

次の制限は、コミットスコープの使用と、それらが有効にするさまざまな耐久性オプションに適用されます。

一般的な制限事項
----------------

-  :ref:`Legacy synchronous replication using PGD <Legacy synchronous replication using PGD>` は、 CAMO、 Eager 、および Group
   Commitで使用されるものとは異なるトランザクション確認のメカニズムを使用します。この2つは互換性がないため、一緒に使用しないでください。
   Group Commit、 CAMO 、またはEagerを使用するときは、
   ``synchronous_standby_names``
   でPGDノードが構成されていないことを確認します。

-  Postgresの2フェーズコミット2PCトランザクションつまり :ref:`PREPARE TRANSACTION <Monitoring through SQL>` 
   は、 CAMO、 Group
   Commit、またはEagerでは使用できません。これらの機能は下で2フェーズコミットを使用するためです。

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

 :ref:`グループコミット <グループコミット>` は、グループ内のノードを介した構成可能な同期コミットを有効にします。この機能を使用する場合、次の制限を考慮してください。

-  グループコミットを使用する場合、すべてのDDLを実行できるわけではありません。サポートされていないDDLを使用する場合、警告がログに記録され、トランザクションのコミットスコープがローカルに設定されます。サポートされているDDL操作は次のとおりです。

   -  非コンカレント ``CREATE INDEX``
   -  非コンカレント ``DROP INDEX``
   -  個々のテーブルまたはインデックスの非コンカレント\ ``REINDEX``
   -  ``CLUSTER`` 単一のリレーションまたはインデックスのみ
   -  ``ANALYZE``
   -  
   -  
   -  
   -  
   -  

-  明示的な2フェーズコミットは、既に2フェーズコミットを使用しているため、グループコミットではサポートされていません。

-  同じトランザクションでの異なるコミット決定オプションの組み合わせ、または同じトランザクションでの異なる競合解決オプションの組み合わせは、サポートされていません。

-  現在、Raftのコミット決定は非常に遅く、非常に低いTPSを生成します。
   ``eager`` 競合解決設定でのみこれらを使用して、PGD 4以前のEager
   All-Node Replication動作を取得することをお勧めします。

Eager
-----

 :ref:`Eager <Eager>` は、グループコミットを介して利用できます。競合する可能性のあるトランザクションを積極的に中止することにより、競合を回避します。これには、グループコミットと同じ制限が適用されます。

-  Eagerでは、 ``NOTIFY`` SQLコマンドまたは\ ``pg_notify()``
   ファンクションは許可されていません。 ``LISTEN`` または\ ``UNLISTEN``
   も許可されません。

CAMO
----

 :ref:`Commit At Most Once <Commit At Most Once>` 
CAMOは、アプリケーションが複数回コミットするのを防ぐことを目的とした機能です。この機能を使用する場合、計画時に次の制限を考慮してください。

-  CAMOは、オリジンノードで最近失敗したCOMMITの結果を照会するように設計されています。切断が発生した場合、アプリケーションはCAMOパートナーからトランザクションステータスを要求する必要があります。障害後、ステータスを要求する前に、遅延ができるだけ少ないことを確認します。アプリケーションは、15分を超えて保存されるCAMO決定に依存してはなりません。

-  再起動などの結果、アプリケーションが割り当てられたグローバル識別子を忘れた場合、それを回復する簡単な方法はありません。したがって、アプリケーションはシャットダウンする前に、未処理のトランザクションが終了するのを待機することをお勧めします。

-  クライアントが適切なチェックを適用するには、
   CAMOによって保護されたトランザクションを、暗黙的なトランザクション制御を備えた単一のステートメントにすることはできません。また、
   CAMOは、トランザクション制御プロシージャ、またはトランザクションを開始または終了しようとする\ ``DO``
   ブロックで使用することはできません。

-  CAMOはコミットステータスを解決しますが、コミット時の保留中の通知を解決しません。
   CAMOでは、 ``NOTIFY`` SQLコマンドまたは\ ``pg_notify()``
   ファンクションは許可されていません。 ``LISTEN`` または\ ``UNLISTEN``
   も許可されません。

-  変更を再生するときに、
   CAMOトランザクションは他のトランザクションと同様に競合を検出する場合があります。タイムスタンプ競合検出が使用される場合、
   CAMOトランザクションは、プリペアオンザオリジンノードのタイムスタンプを使用します。これは、トランザクションがオリジンノード自分自身で可視される前です。

-  CAMOは現在トランザクションストリーミングと互換性がありません。
   CAMOを使用する予定がある場合は、必ずトランザクションストリーミングを無効にしてください。このオプションはグローバルにまたはPGDノードグループで構成できます。
   :ref:`Transaction streaming configuration <Transaction streaming>`  を参照してください。

-  CAMOは現在デコードワーカーと互換性がありません。
   CAMOを使用する予定がある場合は、デコードワーカーを有効にしないようにしてください。このオプションはPGDノードグループで構成できます。
   :ref:`Decoding worker disabling <Decoding worker>` を参照してください。

-  CAMOを使用する場合、すべてのDDLを実行できるわけではありません。サポートされていないDDLを使用する場合、警告がログに記録され、トランザクションのコミットスコープはローカルのみに設定されます。サポートされているDDL操作は次のとおりです。

   -  非コンカレント ``CREATE INDEX``
   -  非コンカレント ``DROP INDEX``
   -  個々のテーブルまたはインデックスの非コンカレント\ ``REINDEX``
   -  ``CLUSTER`` 単一のリレーションまたはインデックスのみ
   -  ``ANALYZE``
   -  
   -  
   -  
   -  
   -  

-  明示的な2フェーズコミットは、既に2フェーズコミットを使用しているため、
   CAMOではサポートされていません。

-  CAMOトランザクションのみを\ ``DEGRADE TO``
   句と組み合わせて、可用性が低下した場合に非同期オペレーションに切り替えることができます。
