競合の処理

同期コミュニティ内の項目に対して行われた変更を正しく反映するためには、同期元プロバイダーから送信された項目と、同期先レプリカの項目との間で生じた競合を同期先プロバイダーが検出し、処理する必要があります。Sync Framework には、競合の検出と処理に必要な作業の大部分を実行する Change Applier オブジェクトが備わっています。

Sync Framework では、同期中に発生する可能性のある同時実行の競合制約の競合の 2 種類の競合がサポートされます。同時実行の競合は、後で同期される 2 つの異なるレプリカで、同じ項目または変更単位が変更された場合に発生します。制約の競合は、項目または変更単位が持つ制約 (フォルダーの関係や、ファイル システムにおいて、まったく同じ名前が付けられたデータの場所など) に違反する競合です。

Sync Framework は、同期アプリケーションが 2 とおりの方法で競合の解決方法を指定できるようになっています。1 つは、セッション中に発生したすべての競合に適用する解決方法を 1 つ設定する方法です。もう 1 つは、競合が発生するたびに通知を受け取れるように登録する方法です。後者の場合、それぞれの競合を調べて個別に解決できます。

競合処理の実行フロー

競合の検出と処理は、同期の変更適用フェーズで行われます。通常、この処理を実行するのは、同期先プロバイダーの ProcessChangeBatch (マネージ コードの場合) または ProcessChangeBatch (アンマネージ コードの場合) メソッドです。

同期先プロバイダーが Sync Framework の Change Applier を使用する際は、変更バッチの各項目について次の手順が実行されます。

  1. 同期先レプリカ内の項目を更新することによって同期元の変更との間に同時実行の競合が生じないかを Change Applier が検証します。たとえば、同期元と同期先の両方のレプリカで、同じ項目がローカルで変更された場合、更新と更新の競合が検出されます。

  2. 同時実行の競合に対する解決方法がアプリケーションによって指定されている場合は、その解決方法に応じた、競合の解決アクションを Change Applier が割り当てます。それ以外の場合、Change Applier が競合の発生をアプリケーションに通知し、アプリケーションが、競合の解決アクションを指定します。

  3. Change Applier が同期先プロバイダーに対する呼び出しをディスパッチし、競合の解決アクションに基づいて変更を適用します。たとえば、同期先レプリカから項目を削除し、同期元プロバイダーからの項目と置き換えます。

  4. 同期先プロバイダーは、同期先レプリカに対して変更を適用するときに、制約の競合を検出します。たとえば、同期元の変更が id1 で識別され "FavoriteBooks" という名前が付いているときに、同期先レプリカに、id2 で識別される同じ名前 ("FavoriteBooks") の項目が存在するようなケースです。同期先レプリカでは、2 つの項目が同じ名前であるため、その項目は同じものと見なされます。しかし、Sync Framework から見ると項目 ID が異なるため、両者は異なる項目です。同期先プロバイダーは、制約の競合を Change Applier に報告します。

  5. アプリケーションによって衝突競合の解決方法が指定され、なおかつ、制約の競合が衝突によるものである場合、その解決方法に応じた競合の解決アクションを Change Applier が割り当てます。それ以外の場合、Change Applier が競合の発生をアプリケーションに通知し、アプリケーションが、競合の解決アクションを指定します。

  6. Change Applier が同期先プロバイダーに対する呼び出しをディスパッチし、競合の解決アクションに基づいて変更を適用します。

同時実行の競合処理の詳細については、「同時実行の競合の検出および解決」を参照してください。

制約の競合処理の詳細については、「制約の競合の検出および解決」を参照してください。

変更単位を使用した競合の回避

サブ項目の変更を変更単位を使って表すことにより、競合の数を減らすことができます。変更単位を使用した場合、項目全体のバージョンではなく、変更単位のバージョンが追跡されます。したがって、同じ項目に対する変更でも、変更単位が異なれば、競合することはありません。詳細については、「変更単位の同期」を参照してください。

競合のログ記録

ユーザーが競合を確認してその解決方法を決定する必要がある場合など、同期セッションとは別に競合を解決できるように、競合をログに記録しておくと便利です。また、競合する 2 つの項目のデータをマージすることによって制約の競合を解決する場合、同期セッション中、Change Applier が一時的な競合を保存するために、その競合ログを使用することもできます。

競合ログの作成と使用の詳細については、「競合のログ記録と管理」を参照してください。

参照

リファレンス

ISynchronousNotifyingChangeApplier インターフェイス
ISynchronousNotifyingChangeApplierTarget インターフェイス
NotifyingChangeApplier
INotifyingChangeApplierTarget

概念

標準のカスタム プロバイダーの実装
変更の適用