更新可能なサブスクリプションの動作方法

トランザクション レプリケーションの更新可能なサブスクリプションを使用して、サブスクライバはパブリッシャに変更をレプリケートできます。トリガはサブスクリプション データベースのパブリッシュされたテーブルに追加され、サブスクライバで変更が発生すると、次のようにしてトリガが起動されます。

  • 即時更新サブスクリプションでは、変更は直接パブリッシャに反映され、Microsoft 分散トランザクション コーディネータ (MSDTC) を使用して適用されます。

  • キュー更新サブスクリプションでは、変更はまずキューに反映され、その後キュー リーダー エージェントによってパブリッシャに適用されます。

パブリッシャでの変更は、読み取り専用のサブスクライバを持つトランザクション パブリケーションと同様の方法でサブスクライバにレプリケートされます。詳細については、「トランザクション レプリケーションの動作方法」を参照してください。

即時更新

即時更新サブスクリプションでは、以下のコンポーネントを使用します。

  • パブリッシュされた各テーブルの追跡列

    更新可能なサブスクリプションが使用できるパブリケーションでテーブルがパブリッシュされると、列 msrepl_tran_version がテーブルに追加されます。この列は、変更の追跡と競合の検出に使用されます。サブスクライバがデータの古いコピーを更新すると、即時更新で競合が発生します。

  • MSDTC

    サブスクライバで変更が発生するたびに、MSDTC は変更をコミットするパブリッシャとサブスクライバ間の 2 フェーズ コミット操作を管理します。この方法では、使用可能にする必要があるのはパブリッシャのみであるため、参加するすべてのサイトに 2 フェーズ コミットを使用するような制限がありません。変更は、パブリッシャで 2 フェーズ コミットによって行われた後で、ディストリビューション エージェントによって他のサブスクライバにレプリケートされます。

  • サブスクリプション データベースのテーブルのトリガ

    サブスクリプション データベース内のパブリッシュされた各テーブルには、INSERT トリガ、UPDATE トリガ、DELETE トリガが追加されます。トリガは CREATE TRIGGER ステートメントの NOT FOR REPLICATION 修飾子で作成されるため、ディストリビューション エージェントによって適用された変更では、トリガは起動されません。詳細については、「NOT FOR REPLICATION を使用した制約、ID、およびトリガの制御」を参照してください。

    即時更新サブスクリプションでは、トリガはサブスクライバでの ID 列および timestamp 列の値も管理します。これらの列に対してパブリッシャで値が生成され、2 フェーズ コミット操作の一環としてサブスクライバに反映されます。

  • ストアド プロシージャ

    パブリケーションを作成し、即時更新サブスクリプションを有効にすると、パブリケーション データベース内のパブリッシュされた各テーブルに対して、INSERT プロシージャ、UPDATE プロシージャ、DELETE プロシージャが作成されます。サブスクライバで変更が発生すると、レプリケーション トリガが MSDTC を介してパブリッシャの該当するストアド プロシージャへリモート プロシージャ コールを発行し、変更が反映されます。

    パブリッシャのストアド プロシージャで変更が適用されるのは、変更された行のコピーをサブスクライバが最後に受信した後で、その変更がパブリッシャ側で発生した変更と競合していない場合に限られます。競合が検出されると、そのトランザクションは拒否され、パブリッシャおよびサブスクライバでロールバックが実行されます。

以下の図は、即時更新サブスクリプションを含むトポロジで使用する主なコンポーネントを示しています。

即時更新コンポーネントとデータ フロー

  1. サブスクライバで発生する変更は、サブスクライブするテーブルのトリガでキャプチャされます。

  2. トリガは MSDTC を介してパブリッシャ側の該当するストアド プロシージャを呼び出します。

  3. ストアド プロシージャは競合がない限り、挿入、更新、または削除を実行します。競合があると、パブリッシャおよびサブスクライバで変更がロールバックされます。

  4. サブスクライバからレプリケートされた変更の結果としてパブリッシャ側に発生する変更は、ディストリビューション エージェントのスケジュールに従って、他のすべてのサブスクライバに反映されます。

キュー更新

キュー更新サブスクリプションでは、以下のコンポーネントを使用します。

  • パブリッシュされた各テーブルの追跡列

    更新可能なサブスクリプションが使用できるパブリケーションでテーブルがパブリッシュされると、列 msrepl_tran_version がテーブルに追加されます。この列は、変更の追跡と競合の検出に使用されます。

  • サブスクリプション データベースのテーブルのトリガ

    サブスクリプション データベース内のパブリッシュされた各テーブルには、INSERT トリガ、UPDATE トリガ、DELETE トリガが追加されます。トリガは CREATE TRIGGER ステートメントの NOT FOR REPLICATION 修飾子で作成されるため、ディストリビューション エージェントによって適用された変更では、トリガは起動されません。詳細については、「NOT FOR REPLICATION を使用した制約、ID、およびトリガの制御」を参照してください。

  • ストアド プロシージャ

    パブリケーションを作成し、キュー更新サブスクリプションを有効にすると、パブリケーション データベース内のパブリッシュされた各テーブルに対して、INSERT プロシージャ、UPDATE プロシージャ、DELETE プロシージャが作成されます。

    ストアド プロシージャはキュー リーダー エージェントから呼び出され、パブリッシャでトランザクションを適用したり、競合を検出するほか、必要に応じて補正コマンドを生成します。補正コマンドは、ディストリビューション データベースに送られ、サブスクライバに配信されます。

    また、パブリッシャでの競合情報をログに記録し、必要に応じて関連のサブスクライバに競合情報を送信するストアド プロシージャもパブリッシャで作成されます。このストアド プロシージャは、競合が検出されると、キュー リーダー エージェントによって呼び出されます。

  • Microsoft SQL Server キュー

    各サブスクリプション データベース内には、サブスクライバからの変更を格納するシステム テーブル MSreplication_queue があります。

  • SQL Server キュー リーダー エージェント

    キュー リーダー エージェントは、MSreplication_queue から変更を読み取り、パブリッシャに適用します。詳細については、「レプリケーション キュー リーダー エージェント」を参照してください。

以下の図は、キュー更新サブスクリプションを含むトポロジで使用する主なコンポーネントを示しています。

キュー更新コンポーネントとデータ フロー

  1. サブスクライバで発生する更新は、サブスクライブするテーブルのトリガでキャプチャされます。トリガはこれらの更新を MSreplication_queue に格納します。

  2. キュー リーダー エージェントは、キューに格納されたトランザクションを MSreplication_queue から読み取り、レプリケーションのストアド プロシージャを使用して適切なパブリケーションに適用します。

  3. キューに格納されたトランザクションを適用するときに、競合があれば検出され、パブリケーション作成時に設定した競合解決方法に従って解決されます。その結果、補正コマンドが生成され、標準のトランザクション レプリケーション配信処理を使用して、サブスクライバにトランザクションをロールバックする可能性があります (補正コマンドは競合が発生したサブスクライバにのみ送信されます)。詳細については、「キュー更新における競合の検出と解決」を参照してください。

  4. サブスクライバからレプリケートされた変更の結果としてパブリッシャ側に発生する変更は、ディストリビューション エージェントのスケジュールに従って、他のすべてのサブスクライバに反映されます。