マージ レプリケーションの競合検出および解決の詳細
パブリッシャとサブスクライバが接続され、同期が発生すると、マージ エージェントによって競合の検出が行われます。競合が検出された場合、マージ エージェントは競合回避モジュール (アーティクルをパブリケーションに追加するときに指定) を使用して、他のサイトに反映する許容データを決定します。競合の種類の一覧については、「マージ レプリケーションで競合を検出および解決する方法」の「競合の種類」を参照してください。
注 |
---|
サブスクライバとパブリッシャの同期が取られていても、異なるサブスクライバで行われた更新の間に競合が発生する場合があります。これに比べ、サブスクライバとパブリッシャにおける更新では、競合はあまり発生しません。 |
競合検出および解決の動作は、次のオプションによって異なります。これらのオプションについては、このトピックで解説します。
列レベルの追跡、行レベルの追跡、または論理レコードレベルの追跡のいずれかを指定しているかどうか。
優先度に基づく解決メカニズムを指定しているかどうか、またはアーティクル競合回避モジュールを指定しているかどうか。アーティクル競合回避モジュールは次のいずれかになります。
マネージ コードで記述されたビジネス ロジック ハンドラ
COM ベースのカスタム競合回避モジュール
Microsoft によって提供される COM ベースの競合回避モジュール
既定の解決メカニズムを使用する場合、クライアントまたはサーバーのどちらのサブスクリプションが使用されるかによっても動作が異なります。
競合検出
データの変更が競合と見なされるかどうかは、アーティクルに対して設定した競合の追跡の種類によって異なります。
列レベルの追跡を選択している場合、複数のレプリケーション ノードで行われた同一行の同一列に対する変更が競合と見なされます。
行レベルの追跡を選択している場合、複数のレプリケーション ノードで行われた同一行の任意の列に対する変更が競合と見なされます (該当する行で影響を受ける列が同一である必要はありません)。
論理レコードレベルの追跡を選択している場合、複数のレプリケーション ノードで行われた同一論理レコードの任意の行に対する変更が競合と見なされます (該当する行で影響を受ける列が同一である必要はありません)。
追跡レベルの詳細については、「マージ レプリケーションで競合を検出および解決する方法」の「追跡レベル」および「論理レコードの競合の検出および解決」を参照してください。
アーティクルに対して競合の追跡と競合解決のレベルを指定するには
Microsoft Management Studio: マージ アーティクルの競合追跡と回避のレベルを指定する方法 (SQL Server Management Studio)
レプリケーション Transact-SQL プログラミング : マージ アーティクルに競合の追跡と解決のレベルを指定する方法 (レプリケーション Transact-SQL プログラミング)
競合解決
競合が検出されると、選択した競合回避モジュールがマージ エージェントによって起動され、この競合回避モジュールを使用して、競合で優先するデータを決定します。競合で優先された行がパブリッシャおよびサブスクライバで適用され、優先されなかった行のデータは競合テーブルに書き込まれます。対話型操作による競合解決を選択しなかった場合、競合はモジュールの実行直後に解決されます。
競合回避モジュールの種類
マージ レプリケーションでは、アーティクル レベルで競合解決が行われます。複数のアーティクルで構成されているパブリケーションの場合、複数の競合回避モジュールで各アーティクルに対応するか、1 つの競合回避モジュールで 1 つのアーティクル、複数のアーティクル、またはパブリケーションを構成するすべてのアーティクルに対応できます。
既定の優先度に基づく競合回避モジュールを使用する場合、アーティクルに対して競合回避モジュール プロパティを設定する必要はありません。既定の競合回避モジュールではなくアーティクル競合回避モジュールを使用する場合、パブリッシャで使用できる競合回避モジュールを選択し、アーティクルに対して競合回避モジュールのプロパティを設定する必要があります。競合回避モジュールに渡す必要がある特定の情報を、競合回避モジュール情報のプロパティに指定することもできます。
マージ レプリケーションでは、次に示す 4 つの競合回避モジュールを使用できます。
既定の優先度に基づく競合回避モジュール
既定の解決メカニズムの動作は、クライアント サブスクリプションまたはサーバー サブスクリプションのどちらが使用されているかによって異なります。サーバー サブスクリプションを使用する個々のサブスクライバに優先度値を割り当てると、最も優先度の高いノードで行われた変更が競合で最優先されます。クライアント サブスクリプションの場合は、パブリッシャに書き込まれた最初の変更が優先されます。サブスクリプションの種類の詳細については、「マージ レプリケーションで競合を検出および解決する方法」の「サブスクリプションの種類」を参照してください。
サブスクリプションの作成後にその種類を変更することはできません。
ビジネス ロジック ハンドラ
ビジネス ロジック ハンドラ フレームワークを使用すると、マネージ コードのアセンブリを記述して、マージ同期処理中に呼び出すことができます。このアセンブリには、競合など同期中に発生するさまざまな状況に対処するためのビジネス ロジックを記述できます。詳細については、「マージ同期中のビジネス ロジックの実行」を参照してください。
COM ベースのカスタム競合回避モジュール
マージ レプリケーションには、競合回避モジュールを COM オブジェクトとして作成するための API が用意されています。この COM オブジェクトは、Microsoft Visual C++ や Microsoft Visual Basic などの言語で記述します。詳細については、「COM ベースのカスタム競合回避モジュール」を参照してください。
Microsoft によって提供される COM ベースの競合回避モジュール
Microsoft SQL Server には、COM ベースの競合回避モジュールが各種用意されています。詳細については、「Microsoft COM ベースの競合回避モジュール」を参照してください。
適切な競合回避モジュールの選択方法の詳細については、「競合回避モジュールの選択」を参照してください。
注 |
---|
アーティクル競合回避モジュールの中には、特定の操作が行われた場合のみ競合を処理するように作成されているものもあります。たとえば、更新については処理するが、挿入や削除については処理しない競合回避モジュールがあります。既定の優先度に基づく競合回避モジュールでは、アーティクル競合回避モジュールで処理されない競合が処理されます。 |
マージ サブスクリプションの種類と競合解決の優先度を指定するには
SQL Server Management Studio: マージ サブスクリプションの種類と競合解決の優先度を指定する方法 (SQL Server Management Studio)
レプリケーション Transact-SQL プログラミング : プル サブスクリプションを作成する方法 (レプリケーション Transact-SQL プログラミング) および プッシュ サブスクリプションを作成する方法 (レプリケーション Transact-SQL プログラミング)
レプリケーション管理オブジェクト (RMO) プログラミング : プル サブスクリプションを作成する方法 (RMO プログラミング) および プッシュ サブスクリプションを作成する方法 (RMO プログラミング)
インタラクティブ競合回避モジュール
レプリケーションにはインタラクティブ競合回避モジュールのユーザー インターフェイスが用意されており、既定の優先度に基づく競合回避モジュールやアーティクル競合回避モジュールと併用できます。Microsoft Windows 同期マネージャを使用して要求時同期を実行すると、インタラクティブ競合回避モジュールに実行時の競合データが表示され、競合の解決方法を選択できます。対話型解決を有効にする方法およびインタラクティブ競合回避モジュールの起動方法の詳細については、「インタラクティブな競合解決」を参照してください。
競合の表示
競合を表示する最も簡単な方法はレプリケーション競合表示モジュールを使用することです。このモジュールは SQL Server Management Studio から使用できます (SQL Server には、競合テーブルに対してクエリを実行するためのストアド プロシージャも用意されています)。競合表示モジュールはインタラクティブ競合回避モジュールに似たツールです。ただし、インタラクティブ競合回避モジュールが同期実行時の競合の解決に使用されるのに対し、競合表示モジュールは解決後の競合の表示を目的として設計されています。競合メタデータがシステム テーブルでまだ利用可能な場合 (競合メタデータの既定の保持期間は 14 日間)、競合表示モジュールを使用して競合の解決結果を上書きできます。ただし、直接的な介入が定期的に必要となる場合は、インタラクティブ競合回避モジュールの使用を検討してください。
注 |
---|
論理レコードに関連する競合は、競合表示モジュールには表示されません。これらの競合に関する情報を表示するには、レプリケーション ストアド プロシージャを使用します。詳細については、「マージ パブリケーションの競合情報を表示する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。 |
競合表示モジュールには、次に示す 3 つのシステム テーブルの情報が表示されます。
レプリケーションは、マージ アーティクルの各テーブルに対して競合テーブルを作成し、そのテーブルに MSmerge_conflict_<PublicationName>_<ArticleName> という形式の名前を付けます。
競合テーブルには、基になるテーブルと同じ構造があります。これらのテーブルの行は競合で優先されなかった行で構成されています (競合で優先された行は実際のユーザー テーブルにあります)。
MSmerge_conflicts_info テーブルは、競合の種類など各競合に関する情報を提供します。
sysmergearticles テーブルは、競合テーブルを持つユーザー テーブルを示し、競合テーブルに関する情報を提供します。
競合情報の既定の保存先は次のとおりです。
パブリケーションの互換性レベルが 90 RTM 以上の場合は、パブリッシャおよびサブスクライバに保存されます。互換性レベルの詳細については、「レプリケーション トポロジにおける複数バージョンの SQL Server の使用」の「マージ パブリケーションの互換性レベル」を参照してください。
パブリケーションの互換性レベルが 80 RTM 未満の場合は、パブリッシャに保存されます。
サブスクライバが SQL Server Compact 3.5 SP2 を実行している場合は、パブリッシャに保存されます。競合データを SQL Server Compact 3.5 SP2 サブスクライバに保存することはできません。
競合を表示するには
SQL Server Management Studio: マージ パブリケーションでデータの競合を表示および解決する方法 (SQL Server Management Studio)
レプリケーション Transact-SQL プログラミング : マージ パブリケーションの競合情報を表示する方法 (レプリケーション Transact-SQL プログラミング)