次の方法で共有


進化したマージレプリケーションの競合検出と解決

パブリッシャーとサブスクライバーが接続され、同期が行われると、マージ エージェントは競合があるかどうかを検出します。 競合が検出された場合、マージ エージェントは競合回避モジュール (アーティクルがパブリケーションに追加されるときに指定されます) を使用して、受け入れられ、他のサイトに伝達されるデータを決定します。

サブスクライバーはパブリッシャーと同期しますが、通常、サブスクライバーとパブリッシャーで行われる更新ではなく、異なるサブスクライバーで行われた更新の間で競合が発生します。

競合の検出と解決の動作は、このトピックで説明する次のオプションによって異なります。

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

  • 既定の優先度ベースの解決メカニズムを指定するか、アーティクル リゾルバーを指定するか。 アーティクル リゾルバーは次のようになります。

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

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

    • Microsoft が提供する COM ベースの競合回避モジュール。

    既定の解決メカニズムを使用する場合、動作は、使用されるサブスクリプションの種類 (クライアントまたはサーバー) によってさらに決定されます。

競合の検出

データ変更が競合として適格かどうかは、記事に設定した競合追跡の種類によって異なります。

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

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

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

詳細については、「 論理レコードの競合の検出と解決」を参照してください。

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

競合の解決

競合が検出されると、マージ エージェントは選択した競合回避モジュールを起動し、競合回避モジュールを使用して競合の勝者を特定します。 勝利行はパブリッシャーとサブスクライバーに適用され、敗北行のデータは競合テーブルに書き込まれます。 競合を対話形式で解決することを選択しない限り、競合はリゾルバーの実行直後に解決されます。

リゾルバーの種類

マージ レプリケーションでは、競合の解決はアーティクル レベルで行われます。 複数のアーティクルで構成されるパブリケーションの場合は、異なるアーティクルを処理する異なる競合回避モジュールを使用することも、同じ競合回避モジュールを 1 つのアーティクル、複数のアーティクル、またはパブリケーションを構成するすべてのアーティクルを提供することもできます。

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

マージ レプリケーションには、次の 4 種類の競合回避モジュールが用意されています。

  • 既定の優先度ベースの競合回避モジュール

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

    サブスクリプションを作成した後は、ある種類から別の種類に変更することはできません。

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

    ビジネス ロジック ハンドラー フレームワークを使用すると、マージ同期プロセス中に呼び出されるマネージド コード アセンブリを記述できます。 アセンブリには、同期中に競合やその他の多くの条件に対応できるビジネス ロジックが含まれています。 詳細については、「 マージ同期中のビジネス ロジックの実行」を参照してください。

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

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

  • Microsoft が提供する COM ベースの競合回避モジュール

    Microsoft SQL Server には、COM ベースのリゾルバーが多数含まれています。 詳細については、「 Microsoft COM-Based Resolvers」を参照してください。

適切な種類のリゾルバーを選択する方法については、「リゾルバーの 選択」を参照してください。

一部の記事リゾルバーは、特定の操作に対してのみ競合を処理するように記述されています。 たとえば、リゾルバーは更新を処理できますが、挿入や削除は処理しません。 既定の優先度ベースの競合回避モジュールは、アーティクル 競合回避モジュールによって処理されない競合を処理します。

マージ サブスクリプションの種類と競合解決の優先順位を指定するには、次を参照してください。

対話型リゾルバー

レプリケーションには、既定の優先度ベースの競合回避モジュールまたはアーティクル 競合回避モジュールと組み合わせて使用できる対話型リゾルバー ユーザー インターフェイスが用意されています。 Microsoft Windows 同期マネージャーを使用してオンデマンド同期を実行する場合、対話型リゾルバーは実行時に競合データを表示し、競合を解決する方法を選択できます。 対話型解決を有効にして対話型競合回避モジュールを起動する方法の詳細については、「 対話型競合解決」を参照してください。

競合の表示

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

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

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

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

    競合テーブルの構造は、基になっているテーブルと同じです。 これらのテーブルの 1 つの行は、競合行の失われるバージョンで構成されます (行の優先バージョンは実際のユーザー テーブルにあります)。

  • MSmerge_conflicts_info テーブルには、競合の種類など、各競合に関する情報が表示されます。

  • sysmergearticles テーブルは、競合テーブルを持つユーザーテーブルを特定し、その競合テーブルについての情報を提供します。

既定では、競合情報が保存されます。

  • パブリッシャーとサブスクライバーで、パブリケーション互換性レベルが 90RTM 以上の場合。

  • パブリケーションの互換性レベルが 80RTM より低い場合は、パブリッシャーで。

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

競合を表示するには

こちらもご覧ください

データの同期