データベース ミラーリングおよび複数データベースにまたがるトランザクション

複数のデータベースにまたがるトランザクションまたは分散トランザクションでは、データベース ミラーリングがサポートされません。これは、次の理由により、トランザクションの原子性と整合性を保証できないためです。

  • 複数のデータベースにまたがるトランザクションの場合 : フェールオーバーが発生すると、別のサーバー インスタンス上のミラー データベースに処理が引き継がれます。その結果、多くの場合、ミラー データベースとミラー化されていないデータベースが別々のサーバー上に配置されることになります。両方のデータベースを同一の 2 つのパートナー間でミラー化した場合でも、両方のデータベースが同時にフェールオーバーするとは限りません。

  • 分散トランザクションの場合 : フェールオーバー後、新しいプリンシパル サーバーは、同一のリソース ID を使用する、以前のプリンシパル サーバーの分散トランザクション コーディネータに接続できません。このため、新しいプリンシパル サーバーはトランザクションの状態を取得できません。

次の例では、論理的な不一致が発生するしくみについて説明します。この例では、アプリケーションは複数データベースにまたがるトランザクションを使用して 2 行のデータを挿入します。一方の行は、ミラー化されたデータベース A 内のテーブルに挿入され、もう一方の行は、別のデータベース B 内のテーブルに挿入されます。データベース A は、自動フェールオーバーを伴う高い安全性モードでミラー化されています。トランザクションがコミットされている間、データベース A は使用できなくなり、ミラーリング セッションはデータベース A のミラーに自動的にフェールオーバーされます。

フェールオーバー後、複数データベースにまたがるトランザクションは、データベース B では正常にコミットされますが、フェールオーバーされたデータベースではコミットされない場合があります。これは、障害発生前に、複数データベースにまたがるトランザクションのログがデータベース A の元のプリンシパル サーバーからミラー サーバーに送信されなかった場合に発生します。フェールオーバー後、そのトランザクションは新しいプリンシパル サーバーに存在しなくなります。データベース B に挿入されたデータはそのまま保たれますが、データベース A に挿入されたデータは失われているため、データベース A と B は一致しなくなります。

同様の状況は、MS DTC トランザクションを使用する際に発生する場合があります。たとえば、フェールオーバー後、新しいプリンシパルが MS DTC にアクセスします。ただし、MS DTC は、新しいプリンシパル サーバーを認識せず、"コミットの準備が整った" トランザクションを終了します。これらのトランザクションは、他のデータベースでコミットされていると見なされます。