マージ レプリケーションの競合検出および解決の詳細

パブリッシャーとサブスクライバーが接続され、同期が発生すると、マージ エージェントによって競合の検出が行われます。 競合が検出された場合、マージ エージェントは競合回避モジュール (アーティクルをパブリケーションに追加するときに指定) を使用して、他のサイトに反映する許容データを決定します。

Note

サブスクライバーとパブリッシャーの同期が取られていても、異なるサブスクライバーで行われた更新の間に競合が発生する場合があります。これに比べ、サブスクライバーとパブリッシャーにおける更新では、競合はあまり発生しません。

競合検出および解決の動作は、次のオプションによって異なります。これらのオプションについては、このトピックで解説します。

  • 列レベルの追跡、行レベルの追跡、または論理レコードレベルの追跡のいずれかを指定しているかどうか。

  • 優先度に基づく解決メカニズムを指定しているかどうか、またはアーティクル競合回避モジュールを指定しているかどうか。 アーティクル競合回避モジュールは次のいずれかになります。

    • マネージド コードで記述された ビジネス ロジック ハンドラー

    • COM ベースの カスタム競合回避モジュール

    • Microsoftによって提供される COM ベースの競合回避モジュール

    既定の解決メカニズムを使用する場合、クライアントまたはサーバーのどちらのサブスクリプションが使用されるかによっても動作が異なります。

競合検出

データの変更が競合と見なされるかどうかは、アーティクルに対して設定した競合の追跡の種類によって異なります。

  • 列レベルの追跡を選択している場合、複数のレプリケーション ノードで行われた同一行の同一列に対する変更が競合と見なされます。

  • 行レベルの追跡を選択している場合、複数のレプリケーション ノードで行われた同一行の任意の列に対する変更が競合と見なされます (該当する行で影響を受ける列が同一である必要はありません)。

  • 論理レコードレベルの追跡を選択している場合、複数のレプリケーション ノードで行われた同一論理レコードの任意の行に対する変更が競合と見なされます (該当する行で影響を受ける列が同一である必要はありません)。

詳しくは、「 論理レコードの競合の検出および解決」をご覧ください。

アーティクルに対して競合の追跡と競合解決のレベルを指定するには、「 マージ アーティクルの競合追跡と解決のレベルを指定」を参照してください。

競合解決

競合が検出されると、選択した競合回避モジュールがマージ エージェントによって起動され、この競合回避モジュールを使用して、競合で優先するデータを決定します。 競合で優先された行がパブリッシャーおよびサブスクライバーで適用され、優先されなかった行のデータは競合テーブルに書き込まれます。 対話型操作による競合解決を選択しなかった場合、競合はモジュールの実行直後に解決されます。

競合回避モジュールの種類

マージ レプリケーションでは、アーティクル レベルで競合解決が行われます。 複数のアーティクルで構成されているパブリケーションの場合、複数の競合回避モジュールで各アーティクルに対応するか、1 つの競合回避モジュールで 1 つのアーティクル、複数のアーティクル、またはパブリケーションを構成するすべてのアーティクルに対応できます。

既定の優先度に基づく競合回避モジュールを使用する場合、アーティクルに対して競合回避モジュール プロパティを設定する必要はありません。 既定の競合回避モジュールではなくアーティクル競合回避モジュールを使用する場合、パブリッシャーで使用できる競合回避モジュールを選択し、アーティクルに対して競合回避モジュールのプロパティを設定する必要があります。 競合回避モジュールに渡す必要がある特定の情報を、競合回避モジュール情報のプロパティに指定することもできます。

マージ レプリケーションでは、次に示す 4 つの競合回避モジュールを使用できます。

  • 既定の優先度に基づく競合回避モジュール

    既定の解決メカニズムの動作は、クライアント サブスクリプションまたはサーバー サブスクリプションのどちらが使用されているかによって異なります。 サーバー サブスクリプションを使用する個々のサブスクライバーに優先度値を割り当てると、最も優先度の高いノードで行われた変更が競合で最優先されます。 クライアント サブスクリプションの場合は、パブリッシャーに書き込まれた最初の変更が優先されます。

    サブスクリプションの作成後にその種類を変更することはできません。

  • ビジネス ロジック ハンドラー

    ビジネス ロジック ハンドラー フレームワークを使用すると、マネージド コードのアセンブリを記述して、マージ同期処理中に呼び出すことができます。 このアセンブリには、競合など同期中に発生するさまざまな状況に対処するためのビジネス ロジックを記述できます。 詳細については、「Execute Business Logic During Merge Synchronization」(マージ同期中のビジネス ロジックの実行) をご覧ください。

  • COM ベースのカスタム競合回避モジュール

    マージ レプリケーションには、Microsoft Visual C++や Microsoft Visual Basic などの言語で COM オブジェクトとしてリゾルバーを記述するための API が用意されています。 詳細については、「 COM-Based Custom Resolvers」を参照してください。

  • Microsoft

    Microsoft SQL Server には、COM ベースの競合回避モジュールが各種用意されています。 詳細については、「 Microsoft COM ベースの競合回避モジュール」を参照してください。

適切な競合回避モジュールの種類の選択方法は、「競合回避モジュールの選択」を参照してください。

Note

アーティクル競合回避モジュールの中には、特定の操作が行われた場合のみ競合を処理するように作成されているものもあります。 たとえば、更新については処理するが、挿入や削除については処理しない競合回避モジュールがあります。 既定の優先度に基づく競合回避モジュールでは、アーティクル競合回避モジュールで処理されない競合が処理されます。

マージ サブスクリプションの種類と競合解決の優先度を指定するには、「

インタラクティブ競合回避モジュール

レプリケーションにはインタラクティブ競合回避モジュールのユーザー インターフェイスが用意されており、既定の優先度に基づく競合回避モジュールやアーティクル競合回避モジュールと併用できます。 Microsoft Windows 同期マネージャーを使用して要求時同期を実行すると、インタラクティブ競合回避モジュールに実行時の競合データが表示され、競合の解決方法を選択できます。 対話型解決を有効にする方法およびインタラクティブ競合回避モジュールの起動方法の詳細については、「 Interactive Conflict Resolution」を参照してください。

競合の表示

競合を表示する最も簡単な方法は、SQL Server Management Studioから入手できるレプリケーション競合ビューアーを使用することです (SQL Serverには、競合テーブルのクエリを実行できるストアド プロシージャも用意されています)。 競合表示モジュールはインタラクティブ競合回避モジュールに似たツールです。ただし、インタラクティブ競合回避モジュールが同期実行時の競合の解決に使用されるのに対し、競合表示モジュールは解決後の競合の表示を目的として設計されています。 競合メタデータがシステム テーブルでまだ利用可能な場合 (競合メタデータの既定の保持期間は 14 日間)、競合表示モジュールを使用して競合の解決結果をオーバーライドできます。ただし、直接的な介入が定期的に必要となる場合は、インタラクティブ競合回避モジュールの使用を検討してください。

Note

論理レコードに関連する競合は、競合表示モジュールに表示されません。 これらの競合に関する情報を表示するには、レプリケーション ストアド プロシージャを使用します。 詳細については、「 マージ パブリケーションの競合情報の表示 (レプリケーション Transact-SQL プログラミング)」を参照してください。

競合表示モジュールには、次に示す 3 つのシステム テーブルの情報が表示されます。

  • レプリケーションでは、マージ アーティクル内の各テーブルの競合テーブルが作成され、 名前は MSmerge_conflict_<PublicationName>_<ArticleName という形式になります>

    競合テーブルには、基になるテーブルと同じ構造があります。 これらのテーブルの行は競合で優先されなかった行で構成されています (競合で優先された行は実際のユーザー テーブルにあります)。

  • MSmerge_conflicts_info テーブルは、競合の種類など各競合に関する情報を提供します。

  • sysmergearticles テーブルは、競合テーブルを持つユーザー テーブルを示し、競合テーブルに関する情報を提供します。

競合情報の既定の保存先は次のとおりです。

  • パブリケーションの互換性レベルが 90 RTM 以上の場合は、パブリッシャーおよびサブスクライバーに保存されます。

  • パブリケーションの互換性レベルが 80 RTM 未満の場合は、パブリッシャーに保存されます。

  • サブスクライバーが SQL Server Compactを実行している場合は、パブリッシャーに保存されます。 競合データを SQL Server Compact サブスクライバーに保存することはできません。

競合を表示するには

参照

データの同期