10.3. クライアントでの競合の解決
競合を解決するための一般的なフローには、次の手順が含まれます。
- ミューテーションが発生する - クライアントは、GraphQL ミューテーションを使用してサーバー上のオブジェクトを変更または削除しようとします。
- オブジェクトの読み取り - サーバーは、クライアントが変更しようとしている現在のオブジェクトをデータソース (通常はデータベース) から読み取ります。
- 競合の検出 - サーバーは、現在のオブジェクトをクライアントから送信されたデータと比較して、競合があったかどうかを確認します。競合がある場合、サーバーは Structure of the Conflict Error で概説されている情報を含む応答をクライアントに返します。
- 競合の解決 - クライアントはこの競合を解決しようとし、このデータが競合しなくなることを期待してサーバーに新しいリクエストを行います。
競合解決の実装には、アプリケーションに次の追加が必要です。
-
ミューテーションのコンテキストに追加された
returnType。Working With Conflict Resolution on the Client を参照してください。 - 選択した競合の実装に応じて、タイプ内の追加のメタデータ (バージョンフィールドなど)。Version Based Conflict Detection を参照してください。
- 競合を最初にクライアントに返すサーバー側リゾルバー。詳細は、Server Side Conflict Detection を参照してください。
開発者は、デフォルトの競合解決の実装を使用するか、競合解決のメカニズムを使用して独自の競合解決を実装できます。
デフォルトでは、同じフィールドに変更が加えられていない場合、実装は変更されたペイロードをサーバーに再送信しようとします。サーバーとクライアントでの変更が同じフィールドに影響を与える場合、指定された競合解決のストラテジーの 1 つを使用できます。デフォルトのストラテジーでは、サーバー上のデータに加えてクライアントの変更が適用されます。開発者は、ニーズに合わせて戦略を変更できます。
10.3.1. クライアントでの競合解決の実装 リンクのコピーリンクがクリップボードにコピーされました!
競合解決を有効にするには、競合検出を実行するようにサーバー側リゾルバーを設定する必要があります。検出はさまざまな実装に依存し、競合エラーをクライアントに返すことができます。詳細は、Server Side Conflict Detection を参照してください。
手順
競合を解決するには、ミューテーションコンテキストに returnType パラメーターを指定します。このパラメーターは、操作対象のオブジェクトタイプを定義します。これは、次の 2 つの方法で実装できます。
Data Sync の
offlineMutateを使用している場合は、次のようにreturnTypeパラメーターを直接指定できます。client.offlineMutate({ ... returnType: 'Task' ... })client.offlineMutate({ ... returnType: 'Task' ... })Copy to Clipboard Copied! Toggle word wrap Toggle overflow Apollo の
mutate関数を使用する場合は、次のようにreturnTypeパラメーターを指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
クライアントは、現在のストラテジーに基づいて競合を自動的に解決し、必要に応じてリスナーに通知します。
競合の解決は推奨されるデフォルトで機能し、クライアントで特定の処理を行う必要はありません。
高度なユースケースの場合、アプリケーション設定でカスタム conflictProvider を指定することにより、競合の実装をカスタマイズできます。以下の Conflict Resolution Strategies を参照してください。