トランザクション - 可用性グループとデータベース ミラーリングTransactions - availability groups and database mirroring

適用対象:○SQL Server (2017 以降)XAzure SQL DatabaseXAzure SQL Data Warehouse XParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2017)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

このトピックでは、Always On 可用性グループとデータベース ミラーリングでの複数データベースにまたがるトランザクションと分散トランザクションのサポートについて説明します。This topic describes cross-database and distributed transactions support for Always On availability groups and database mirroring.

分散トランザクションのサポートSupport for distributed transactions

SQL Server 2017 では、可用性グループのデータベースに対して分散トランザクションがサポートされています。SQL Server 2017 supports distributed transactions for databases in availability groups. このサポートには、SQL Server の同じインスタンス上のデータベース、または SQL Server の異なるインスタンス上のデータベースが含まれています。This support includes databases on the same instance of SQL Server or databases on different instances of SQL Server. 分散トランザクションは、データベース ミラーリング用に構成されたデータベースではサポートされていません。Distributed transactions are not supported for databases configured for database mirroring.

注意

[!INCLUDE[SQL Server 2016]](../../../includes/sssql15-md.md)]SQL Server 2016 では、可用性グループのデータベースに対して分散トランザクションが制限付きでサポートされます。(../../../includes/sssql15-md.md)]SQL Server 2016 included limited support for distributed transactions in for databases in an availability group. 可用性グループのデータベースを使用した分散トランザクションは、そのトランザクションの他のインスタンスが、SQL Server の同じインスタンスにない場合に限りサポートされていました。Distributed transactions using databases in an availability group were supported as long as no other databases in the transaction were in the same instance of SQL Server. 詳細については、「SQL Server 2016 DTC Support In Availability Groups」 (可用性グループでの SQL Server 2016 DTC のサポート) を参照してください。For more information, see SQL Server 2016 DTC Support In Availability Groups

分散トランザクション対応の可用性グループの構成については、「Configure Availability Group for Distributed Transactions」 (分散トランザクション対応の可用性グループを構成する)」を参照してください。To configure an availability group for distributed transactions, see Configure Availability Group for Distributed Transactions.

詳細については、次を参照してください。See more information at:

SQL Server 2016 以前: 同じ SQL Server インスタンス内での複数データベースにまたがるトランザクションのサポートSQL Server 2016 and before: Support for cross-database transactions within the same SQL Server instance

SQL Server 2016 以前では、可用性グループに対して、同じ SQL Server インスタンス内での複数データベースにまたがるトランザクションはサポートされていません。In SQL Server 2016 and before, cross-database transactions within the same SQL Server instance are not supported for availability groups. つまり、同じ SQL Server インスタンスでの複数データベースにまたがるトランザクションにおいて 2 つのデータベースをホストすることができない可能性があります。This means that no two databases in a cross-database transaction may be hosted by the same SQL Server instance. これは、これらのデータベースが同じ可用性グループの一部である場合でも当てはまります。This is true even if those databases are part of the same availability group.

複数のデータベースにまたがるトランザクションは、データベース ミラーリングでもサポートされていません。Cross-database transactions are also not supported for database mirroring.

SQL Server 2016: 分散トランザクションのサポート SQL Server 2016: Support for distributed transactions

分散トランザクションは、可用性グループでサポートされています。Distributed transactions are supported with availability groups. これは、2 つの異なる SQL Server インスタンスでホストされるデータベース間の分散トランザクションに当てはまります。This applies to distributed transactions between databases hosted by two different SQL Server instances. また、SQL Server と DTC に準拠した別のサーバー間の分散トランザクションにも当てはまります。It also applies to distributed transactions between SQL Server and another DTC-compliant server.

Microsoft 分散トランザクション コーディネーター (MSDTC または DTC) は、分散システムのトランザクション インフラストラクチャを提供する Windows サービスです。Microsoft Distributed Transaction Coordinator (MSDTC or DTC) is a Windows service that provides transaction infrastructure for distributed systems. MSDTC では、クライアント アプリケーションに対して、1 つのトランザクションに複数のデータ ソースを含め、その後、トランザクションに含まれるすべてのサーバーにコミットすることを許可します。MSDTC permits client applications to include multiple data sources in one transaction which then is committed across all servers included in the transaction. たとえば、MSDTC を使用して、さまざまなサーバーの複数のデータベースにわたるトランザクションを調整することができます。For example, you can use MSDTC to coordinate transactions that span multiple databases on different servers.

SQL Server 2016 では、トランザクションの 1 つ以上のデータベースが可用性グループに含まれる場合、分散トランザクションを使用する機能を導入します。SQL Server 2016 introduces the capability to use distributed transactions where one or more of the databases in the transaction are in an availability group. SQL Server 2016 より前の分散トランザクションでは、可用性グループのデータベースはサポートされていませんでした。Prior to SQL Server 2016 distributed transactions were not supported for databases in availability groups. SQL Server 2016 では、データベースごとにリソース マネージャーを登録できます。SQL Server 2016 can register a resource manager per database. この新機能を使用すると、分散トランザクションでデータベースを可用性グループに含めることができます。This new capability is why distributed transactions can include databases in availability groups.

次の要件が満たされる必要があります。The following requirements must be met:

  • 可用性グループは、Windows Server 2016 または Windows Server 2012 R2 上で実行されている必要があります。Availability groups must be running on Windows Server 2016 or Windows Server 2012 R2. Windows Server 2012 R2 の場合は、 https://support.microsoft.com/en-us/kb/3090973で入手できる KB3090973 の更新プログラムをインストールする必要があります。For Windows Server 2012 R2, you must install the update in KB3090973 available at https://support.microsoft.com/en-us/kb/3090973.

  • Availability groups must be created with the CREATE AVAILABILITY GROUP コマンドと WITH DTC_SUPPORT = PER_DB 句を使用して作成する必要があります。Availability groups must be created with the CREATE AVAILABILITY GROUP command and the WITH DTC_SUPPORT = PER_DB clause. 現在、既存の可用性グループを変更することはできません。You cannot currently alter an existing availability group.

  • 可用性グループに参加するすべての SQL Server インスタンスは、SQL Server 2016 以降である必要があります。All instances of SQL Server that will participate in the availability group must be SQL Server 2016 or later.

    分散トランザクションの非サポートNon-support for distributed transactions

    次の場合、分散トランザクションはサポートされません。Specific cases where distributed transactions are not supported include:

    • SQL Server 2016 以前で、トランザクションに関係する複数のデータベースが同じ可用性グループに含まれる場合。In SQL Server 2016 and prior, where more than one database involved in the transaction is in the same availability group.

    • SQL Server 2016 以前で、少なくとも 1 つのデータベースが可用性グループにあり、別のデータベースが同じインスタンスの SQL Server にある場合。In SQL Server 2016 and prior, where at least one database is in an availability group and another database is on the same instance of SQL Server.

    • 分散トランザクションを有効にして可用性グループが作成されなかった場合。Where the availability group was not created with enable distributed transaction.

    • データベース ミラーリングDatabase mirroring.

    重要

    ご利用の環境で DTC が解決できないトランザクションの適切な既定の結果を判断します。Determine the appropriate default outcome of transactions that DTC is unable to resolve for your environment. 既定の結果の構成方法については、「 in-doubt xact resolution サーバー構成オプション」を参照してください。For information on how to configure the default outcome see in-doubt xact resolution Server Configuration Option.

データベース ミラーリングのサンプル シナリオExample scenario with database mirroring

次に示すデータベース ミラーリングの例では、論理的な不一致が発生するしくみについて説明します。The following database mirroring example illustrates how a logical inconsistency could occur. この例では、アプリケーションは複数データベースにまたがるトランザクションを使用して 2 行のデータを挿入します。一方の行は、ミラー化されたデータベース A 内のテーブルに挿入され、もう一方の行は、別のデータベース B 内のテーブルに挿入されます。データベース A は、自動フェールオーバーを伴う高い安全性モードでミラー化されています。In this example, an application uses a cross-database transaction to insert two rows of data: one row is inserted into a table in a mirrored database, A, and the other row is inserted into a table in another database, B. Database A is being mirrored in high-safety mode with automatic failover. トランザクションがコミットされている間、データベース A は使用できなくなり、ミラーリング セッションはデータベース A のミラーに自動的にフェールオーバーされます。While the transaction is being committed, database A becomes unavailable, and the mirroring session automatically fails over to the mirror of database A.

フェールオーバー後、複数データベースにまたがるトランザクションは、データベース B では正常にコミットされますが、フェールオーバーされたデータベースではコミットされない場合があります。After the failover, the cross-database transaction might be successfully committed on database B but not on the failed-over database. これは、障害発生前に、複数データベースにまたがるトランザクションのログがデータベース A の元のプリンシパル サーバーからミラー サーバーに送信されなかった場合に発生します。This would occur if the original principal server for database A had not sent the log for the cross-database transaction to the mirror server before the failure. フェールオーバー後、そのトランザクションは新しいプリンシパル サーバーに存在しなくなります。After the failover, that transaction would not exist on the new principal server. データベース B に挿入されたデータはそのまま保たれますが、データベース A に挿入されたデータは失われているため、データベース A と B は一致しなくなります。Databases A and B would become inconsistent, because the data inserted in database B remains intact, but the data inserted in database A has been lost.

同様の状況は、MS DTC トランザクションを使用する際に発生する場合があります。A similar scenario can occur while using a MS DTC transaction. たとえば、フェールオーバー後、新しいプリンシパルが MS DTC にアクセスします。For example, after failover, the new principal contacts MS DTC. ただし、MS DTC は、新しいプリンシパル サーバーを認識せず、"コミットの準備が整った" トランザクションを終了します。これらのトランザクションは、他のデータベースでコミットされていると見なされます。But MS DTC has no knowledge of the new principal server, and it terminates any transactions that are "preparing to commit," which are considered committed in other databases.

注意

このトピックで承認されていない DTC とデータベース ミラーリングの使用または DTC と可用性グループの使用はサポートされていません。Using Database Mirroring with DTC or using availability groups with DTC in ways not approved in this topic is not supported. これは、DTC に関係しない部分はサポートされないことを意味するものではありません。ただし、分散トランザクションの不適切な使用により発生する問題はサポートされません。This does not imply that aspects of the product unrelated to DTC are unsupported; however, any issues arising from the improper use of distributed transactions will not be supported.

参照See Also

Always On availability groups: Interoperability (SQL Server)Always On availability groups: Interoperability (SQL Server)