複数データベースにまたがるトランザクションと分散トランザクションは、Always On 可用性グループまたはデータベース ミラーリングではサポートされません。 これは、次の理由により、トランザクションのアトミック性/整合性を保証できないためです。
データベース間トランザクションの場合: 各データベースは個別にコミットされます。 そのため、単一の可用性グループ内のデータベースの場合でも、1 つのデータベースがトランザクションをコミットした後、もう一方のデータベースがコミットする前にフェールオーバーが発生する可能性があります。 データベース ミラーリングの場合、フェールオーバー後、ミラー化されたデータベースは通常、他のデータベースとは異なるサーバー インスタンス上にあり、両方のデータベースが同じ 2 つのパートナー間でミラー化されている場合でも、両方のデータベースが同時にフェールオーバーされる保証がないため、この問題が発生します。
分散トランザクションの場合: フェールオーバー後、新しいプリンシパル サーバー/プライマリ レプリカは、前のプリンシパル サーバー/プライマリ レプリカの分散トランザクション コーディネーターに接続できません。 そのため、新しいプリンシパル サーバー/プライマリ レプリカはトランザクションの状態を取得できません。
次に示すデータベース ミラーリングの例では、論理的な不一致が発生するしくみについて説明します。 この例では、アプリケーションは複数データベースにまたがるトランザクションを使用して 2 行のデータを挿入します。一方の行は、ミラー化されたデータベース A 内のテーブルに挿入され、もう一方の行は、別のデータベース B 内のテーブルに挿入されます。データベース A は、自動フェールオーバーを伴う高い安全性モードでミラー化されています。 トランザクションがコミットされている間、データベース A は使用できなくなり、ミラーリング セッションはデータベース A のミラーに自動的にフェールオーバーされます。
フェールオーバー後、複数データベースにまたがるトランザクションは、データベース B では正常にコミットされますが、フェールオーバーされたデータベースではコミットされない場合があります。 これは、データベース A の元のプリンシパル サーバーが、エラーの前にデータベース間トランザクションのログをミラー サーバーに送信しなかった場合に発生します。 フェールオーバー後、そのトランザクションは新しいプリンシパル サーバーに存在しなくなります。 データベース B に挿入されたデータはそのまま保たれますが、データベース A に挿入されたデータは失われているため、データベース A と B は一致しなくなります。
同様のシナリオは、MS DTC トランザクションの使用中に発生する可能性があります。 たとえば、フェールオーバー後、新しいプリンシパルが MS DTC にアクセスします。 ただし、MS DTC は、新しいプリンシパル サーバーを認識せず、"コミットの準備が整った" トランザクションを終了します。これらのトランザクションは、他のデータベースでコミットされていると見なされます。
重要
データベース ミラーリングまたは可用性グループを DTC と共に使用しても、サポートされていない SQL Server のインストールは行われません。 ただし、データベースがデータベース ミラーリング セッションまたは可用性グループの一部であり、DTC がデータベースでも使用されている場合、サポートの問題は、データベース ミラーリングまたは可用性グループと DTC の組み合わせに関連しない場合にのみ、Microsoft によって調査されます。