分散トランザクション対応の可用性グループを構成するConfigure availability group for distributed transactions

適用対象:○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

SQL Server 2017SQL Server 2017 は、可用性グループのデータベースを含むすべての分散トランザクションをサポートします。 supports all distributed transactions including databases in an availability group. この記事では、分散トランザクションの可用性グループを構成する方法について説明します。This article explains how to configure an availability group for distributed transactions

分散トランザクションを保証するには、分散トランザクション リソース マネージャーとしてデータベースを登録するように、可用性グループを構成する必要があります。In order to guarantee distributed transactions, the availability group must be configured to register databases as distributed transaction resource managers.

注意

SQL Server 2016SQL Server 2016 も分散トランザクションをサポートしますが、 SQL Server 2016SQL Server 2016 でのサポートには制限があります。 also supports distributed transactions, however support in SQL Server 2016SQL Server 2016 is limited. SQL Server 2016SQL Server 2016 では、同じサーバーに複数のデータベースが存在する場合、可用性グループ内のデータベースを使う分散トランザクションはサポートされません。In SQL Server 2016SQL Server 2016 a distributed transaction with a database in an availability group is not supported if it includes more than one database on the same server. SQL Server 2017SQL Server 2017 にはこのような制限はありません。 does not have this limitation.

SQL Server 2016SQL Server 2016 での構成手順は SQL Server 2017SQL Server 2017 の場合と同じです。In SQL Server 2016SQL Server 2016 the configuration steps are the same as in SQL Server 2017SQL Server 2017.

分散トランザクションでは、クライアント アプリケーションは Microsoft 分散トランザクション コーディネーター (MS DTC または DTC) と連携して、複数のデータ ソース間でトランザクションの整合性を保証します。In a distributed transaction, client applications work with Microsoft Distributed Transaction Coordinator (MS DTC or DTC) to guarantee transactional consistency across multiple data sources. DTC は、サポートされている Windows Server ベースのオペレーティング システムで使用可能なサービスです。DTC is a service available on supported Windows Server-based operating systems. 分散トランザクションの場合は、DTC が "トランザクション コーディネーター" です。For a distributed transaction, DTC is the transaction coordinator. 通常は、SQL Server インスタンスが "リソース マネージャー" です。Normally, a SQL Server instance is the resource manager. データベースが可用性グループ内にある場合、各データベースがそれ自体のリソース マネージャーである必要があります。When a database is in an availability group, each database needs to be its own resource manager.

可用性グループが分散トランザクション用に構成されていない場合であっても、 SQL ServerSQL Server は可用性グループ内のデータベースに対する分散トランザクションを妨げません。 SQL ServerSQL Server does not prevent distributed transactions for databases in an availability group - even when the availability group is not configured for distributed transactions. ただし、可用性グループが分散トランザクション対応に構成されていない場合は、一部の状況でフェールオーバーが失敗する可能性があります。However when an availability group is not configured for distributed transactions, failover may not succeed in some situations. 具体的には、新しいプライマリ レプリカの SQL ServerSQL Server インスタンスが、DTC からトランザクションの結果を取得できない場合があります。Specifically the new primary replica SQL ServerSQL Server instance may not be able to get the transaction outcome from DTC. SQL ServerSQL Server インスタンスがフェールオーバー後に DTC から未確定トランザクションの結果を取得できるようにするには、可用性グループを分散トランザクション対応に構成します。To enable the SQL ServerSQL Server instance to get the outcome of in-doubt transactions from the DTC after failover, configure the availability group for distributed transactions.

前提条件Prerequisites

分散トランザクションをサポートするように可用性グループを構成するには、次の前提条件が満たされている必要があります。Before you configure an availability group to support distributed transactions, you must meet the following prerequisites:

  • 分散トランザクションに参加する SQL ServerSQL Server のすべてのインスタンスが、 SQL Server 2016SQL Server 2016 またはそれ以降である必要があります。All instances of SQL ServerSQL Server that participate in the distributed transaction must be SQL Server 2016SQL Server 2016 or later.

  • 可用性グループは、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.

分散トランザクション対応の可用性グループを作成するCreate an availability group for distributed transactions

分散トランザクションをサポートするように可用性グループを構成します。Configure an availability group to support distributed transactions. 各データベースがリソース マネージャーとして登録するのを許可するように、可用性グループを設定します。Set the availability group to allow each database to register as a resource manager. この記事では、各データベースが DTC のリソース マネージャーになることができるように、可用性グループを構成する方法について説明します。This article explains how to configure an availability group so that each database can be a resource manager in DTC.

SQL Server 2016SQL Server 2016 以降では、分散トランザクション対応の可用性グループを作成できます。You can create an availability group for distributed transactions on SQL Server 2016SQL Server 2016 or later. 分散トランザクション対応の可用性グループを作成するには、可用性グループの定義に DTC_SUPPORT = PER_DB を追加します。To create an availability group for distributed transactions, include DTC_SUPPORT = PER_DB in the availability group definition. 次のスクリプトは、分散トランザクション対応の可用性グループを作成します。The following script creates an availability group for distributed transactions.

CREATE AVAILABILITY GROUP MyAG
   WITH (
      DTC_SUPPORT = PER_DB  
      )
   FOR DATABASE DB1, DB2
   REPLICA ON
      Server1 WITH (
         ENDPOINT_URL = 'TCP://SERVER1.corp.com:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = AUTOMATIC  
         )
      Server2 WITH (
         ENDPOINT_URL = 'TCP://SERVER2.corp.com:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = AUTOMATIC  
         )
注意

上のスクリプトは可用性グループの簡単な例であり、特定の運用環境を想定して設計されてはいません。The preceding script is a simple example of an availability group and is not designed for any specific production environment.

分散トランザクション対応に可用性グループを変更するAlter an availability group for distributed transactions

SQL Server 2017SQL Server 2017 以降では、分散トランザクション対応に可用性グループを変更できます。You can alter an availability group for distributed transactions on SQL Server 2017SQL Server 2017 or later. 分散トランザクション対応に可用性グループを変更するには、ALTER AVAILABILITY GROUP スクリプトに DTC_SUPPORT = PER_DB を追加します。To alter an availability group for distributed transactions, include DTC_SUPPORT = PER_DB in the ALTER AVAILABILITY GROUP script. 分散トランザクションをサポートするように可用性グループを変更するスクリプトの例を次に示します。The example script changes the availability group to support distributed transactions.

ALTER AVAILABILITY GROUP MyaAG
   WITH (
      DTC_SUPPORT = PER_DB  
      );
注意

SQL Server 2016SQL Server 2016 では、分散トランザクション対応に可用性グループを変更することはできません。On SQL Server 2016SQL Server 2016 you cannot alter an availability group for distributed transactions. 設定を変更するには、可用性グループをいったん削除した後、DTC_SUPPORT = PER_DB の設定を指定して作成し直します。To change the setting drop, and recreate the availability group with the DTC_SUPPORT = PER_DB setting.

分散トランザクション - 技術的概念Distributed transactions - technical concepts

分散トランザクションとは、2 つ以上のデータベースにまたがるトランザクションです。A distributed transaction spans two or more databases. トランザクション マネージャーとしての DTC は、SQL Server インスタンス間、および他のデータ ソース間でトランザクションを調整します。As the transaction manager, DTC coordinates the transaction between SQL Server instances, and other data sources. SQL ServerSQL Server データベース エンジンの各インスタンスは、リソース マネージャーとして動作できます。Each instance of the SQL ServerSQL Server database engine can operate as a resource manager. 可用性グループが DTC_SUPPORT = PER_DB で構成されていると、データベースはリソース マネージャーとして動作できます。When an availability group is configured with DTC_SUPPORT = PER_DB, the databases can operate as resource managers. 詳細については、MS DTC のドキュメントを参照してください。For more information, see the MS DTC documentation.

データベース エンジンの 1 つのインスタンスに複数のデータベースが含まれるトランザクションは、実際には分散トランザクションです。A transaction with two or more databases in a single instance of the database engine is actually a distributed transaction. ただし、SQL Server インスタンスは分散トランザクションを内部で処理するため、ユーザーにはローカル トランザクションとして動作しているように見えます。The instance manages the distributed transaction internally; to the user, it operates as a local transaction. データベースが DTC_SUPPORT = PER_DB で構成された可用性グループ内にある場合は、たとえ SQL Server の 1 つのインスタンス内に存在する場合であっても、SQL Server 2017SQL Server 2017 はすべてのクロスデータベース トランザクションを DTC に送ります。SQL Server 2017SQL Server 2017 promotes all cross-database transactions to DTC when databases are in an availability group configured with DTC_SUPPORT = PER_DB - even within a single instance of SQL Server.

アプリケーションでは、分散トランザクションはローカル トランザクションとほぼ同様に管理されます。At the application, a distributed transaction is managed much the same as a local transaction. トランザクションの終了時に、アプリケーションがトランザクションのコミットまたはロールバックを要求します。At the end of the transaction, the application requests the transaction to be either committed or rolled back. ただし、トランザクション マネージャーが分散コミットを別の方法で管理することによって、ネットワーク障害により一部のリソース マネージャーがトランザクションを正常にコミットし、その一方で他のリソース マネージャーがトランザクションをロールバックするという危険性を最小限に抑える必要があります。A distributed commit must be managed differently by the transaction manager to minimize the risk that a network failure may result in some resource managers successfully committing while others roll back the transaction. これは、コミット処理を準備フェーズとコミット フェーズの 2 フェーズで管理することによって実現されます。これを 2 フェーズ コミットと呼びます。This is achieved by managing the commit process in two phases (the prepare phase and the commit phase), which is known as a two-phase commit.

  • 準備フェーズPrepare phase

    トランザクション マネージャーはコミット要求を受け取ると、そのトランザクションに関連するすべてのリソース マネージャーに準備コマンドを送ります。When the transaction manager receives a commit request, it sends a prepare command to all of the resource managers involved in the transaction. 各リソース マネージャーは、トランザクションを持続的にするために必要な処理をすべて実行し、そのトランザクションのログ イメージを含むすべてのバッファーをディスクにフラッシュします。Each resource manager then does everything required to make the transaction durable, and all buffers holding log images for the transaction are flushed to disk. リソース マネージャーの準備フェーズが完了すると、トランザクション マネージャーに準備の成否が通知されます。As each resource manager completes the prepare phase, it returns success or failure of the prepare to the transaction manager.

  • コミット フェーズCommit phase

    トランザクション マネージャーは、すべてのリソース マネージャーから準備の正常完了通知を受け取ると、リソース マネージャーにコミット コマンドを送ります。If the transaction manager receives successful prepares from all of the resource managers, it sends commit commands to each resource manager. これにより、リソース マネージャーはコミットを完了できます。The resource managers can then complete the commit. すべてのリソース マネージャーがコミットの正常完了を報告した場合、トランザクション マネージャーは、アプリケーションに成功通知を送ります。If all of the resource managers report a successful commit, the transaction manager then sends a success notification to the application. 準備できなかったことを報告するリソース マネージャーがあった場合、トランザクション マネージャーはすべてのリソース マネージャーにロールバック コマンドを送り、アプリケーションにコミットできなかったことを報告します。If any resource manager reported a failure to prepare, the transaction manager sends a rollback command to each resource manager and indicates the failure of the commit to the application.

詳細な手順Detailed steps

以下では、アプリケーションが DTC と連携して分散トランザクションを実行する方法について説明します。The following list explains how the application works with DTC to complete distributed transactions.

  1. SQL Server インスタンスは DTC トランザクションに登録します。The SQL Server instance enlists in the DTC transaction. これは、トランザクションに複数のリソース マネージャーが存在する場合、またはクライアントがトランザクションを DTC トランザクションに昇格するよう要求している場合に行うことができます。This can happen when there is more than one resource manager in the transaction or if the client requests a transaction be promoted to DTC transaction.
  2. クライアントは、DTC トランザクション下の SQL Server インスタンスで何らかの処理を行います。The client does some work in the SQL Server instance under the DTC transaction.
  3. クライアントは、コミットまたは中止を DTC トランザクションに発行します。The client issues commit or abort for the DTC transaction.
    • クライアントが中止を発行した場合、トランザクションはすぐに中止されます。If the client issues abort, the transaction is aborted immediately.
    • クライアントがコミットを発行した場合、DTC は、トランザクションのすべてのリソース マネージャーにトランザクションの準備を要求することによって、2 フェーズ コミット プロトコルを開始します。If the client issues commit, DTC begins the two-phase commit protocol by asking all the resource managers in the transaction to prepare the transaction.
  4. すべてのリソース マネージャーから準備フェーズが正常に行われたことを示す確認応答を受け取った後、DTC はトランザクションをコミットするようすべてのリソース マネージャーに通知します。DTC informs all resource managers to commit the transaction after all resource managers successfully acknowledge the prepare phase. 何らかの理由で正常な確認応答が妨げられると、DTC はトランザクションを中止します。If anything prevents successful acknowledgement, DTC aborts the transaction.

分散トランザクション対応に可用性グループを変更することの効果Effects of configuring an availability group for distributed transactions

分散トランザクションに参加している各エンティティは、リソース マネージャーと呼ばれます。Each entity participating in a distributed transaction is called a resource manager. リソース マネージャーの例を次に示します。Examples of resource managers include:

  • SQL ServerSQL Server インスタンス。A SQL ServerSQL Server instance.
  • 分散トランザクション対応に構成されている可用性グループのデータベース。A database in an availability group that has been configured for distributed transactions.
  • DTC サービスもトランザクション マネージャーになることができます。DTC service - can also be a transaction manager.
  • その他のデータ ソース。Other data sources.

分散トランザクションに参加するため、 SQL ServerSQL Server のインスタンスは DTC に登録します。In order to participate in distributed transactions, an instance of SQL ServerSQL Server enlists with a DTC. 通常、 SQL ServerSQL Server のインスタンスはローカル サーバー上の DTC に登録します。Normally the instance of SQL ServerSQL Server enlists with DTC on the local server. SQL ServerSQL Server の各インスタンスは、一意のリソース マネージャー ID (RMID) でリソース マネージャーを作成し、それを DTC に登録します。Each instance of SQL ServerSQL Server creates a resource manager with a unique resource manager identifier (RMID) and registers it with DTC. 既定の構成では、 SQL ServerSQL Server のインスタンスのすべてのデータベースが同じ RMID を使います。In the default configuration, all databases on an instance of SQL ServerSQL Server use the same RMID.

データベースが可用性グループ内にある場合、データベースの読み取り/書き込みコピー (プライマリ レプリカ) は、 SQL ServerSQL Server の異なるインスタンスに移動できます。When a database is in an availability group, the read-write copy of the database - or primary replica - may move to a different instance of SQL ServerSQL Server. この移動中に分散トランザクションをサポートするためには、各データベースが独立したリソース マネージャーとして機能し、一意の RMID を持っている必要があります。To support distributed transactions during this movement, each database should act as a separate resource manager and must have a unique RMID. 可用性グループで DTC_SUPPORT = PER_DB が指定されていると、 SQL ServerSQL Server はデータベースごとにリソース マネージャーを作成し、一意の RMID を使って DTC に登録します。When an availability group has DTC_SUPPORT = PER_DB, SQL ServerSQL Server creates a resource manager for each database and registers with DTC using a unique RMID. この構成では、データベースは DTC トランザクションのリソース マネージャーになります。In this configuration, the database is a resource manager for DTC transactions.

SQL ServerSQL Server での分散トランザクションについて詳しくは、「分散トランザクション」をご覧ください。For more detail on distributed transactions in SQL ServerSQL Server, see Distributed transactions

未解決のトランザクションを管理するManage unresolved transactions

RMID の変更中に存在しているアクティブなトランザクションの結果は、フェールオーバー後に復旧できません。The outcome for the active transactions that exists during RMID change cannot be recovered after a failover. これは、登録に使われた RMID SQL Server と、復旧に使われる RMID SQL Server が異なるためです。This is because the RMID SQL Server used to enlist and RMID SQL Server used to recover are different. RMID の変更は、次の場合に発生する可能性があります。The RMID change can happen in following cases:

  • 可用性グループの DTC_SUPPORT を変更する。Change DTC_SUPPORT for an availability group.
  • 可用性グループのデータベースを追加または削除する。Add or remove a database from an availability group.
  • 可用性グループを削除する。Drop an availability group.

これらの場合、プライマリ レプリカが SQL ServerSQL Server の新しいインスタンスにフェールオーバーすると、インスタンスは DTC に接続してトランザクションの結果を取得しようとします。In the preceding cases, if the primary replica fails over to a new instance of SQL ServerSQL Server, the instance tries to contact DTC to identify the transaction result. データベースが復旧中に未確定トランザクションの結果を取得するために使う RMID が以前に登録されていないため、DTC は結果を返すことができません。DTC cannot return the outcome because the RMID that the database is using to get the outcome for in-doubt transactions during recovery was not enlisted before. そのため、データベースは SUSPECT 状態になります。Therefore the database goes into SUSPECT state.

SQL ServerSQL Server の新しいエラー ログには、次の例のようなエントリが含まれます。The new SQL ServerSQL Server error log has an entry like the following example:

Microsoft Distributed Transaction Coordinator (MS DTC) 
failed to reenlist citing that the database RMID does 
not match the RMID [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx] 
associated with the transaction.  Please manually resolve
the transaction.

SQL Server detected a DTC/KTM in-doubt transaction with UOW 
{yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy}.Please resolve it 
following the guideline for Troubleshooting DTC Transactions.

この例は、DTC がフェールオーバー後に作成されたトランザクションの新しいプライマリ レプリカからデータベースを再登録できなかったことを示します。The preceding example shows that DTC could not re-enlist the database from the new primary replica in the transaction that was created after failover. SQL ServerSQL Server のインスタンスは分散トランザクションの結果を判断できないので、データベースを SUSPECT としてマークします。The SQL ServerSQL Server instance cannot determine the result of the distributed transaction so it marks the database as suspect. トランザクションは作業単位 (UOW) としてマークされ、GUID によって参照されます。The transaction is marked as a unit of work (UOW) and referred to by a GUID. データベースを復旧するには、トランザクションを手動でコミットまたはロールバックします。In order to recover the database, either commit or rollback the transaction manually.

警告

トランザクションを手動でコミットまたはロールバックすると、アプリケーションに影響する可能性があります。When you manually commit or rollback a transaction it can affect an application. コミットまたはロールバックのアクションが、アプリケーションの要件と整合していることを確認してください。Verify that the action of commit or rollback is consistent with your application requirements.

次のスクリプトのいずれか 1 つのみを実行します。Run only one of the following scripts:

  • トランザクションをコミットするには、次のスクリプトを更新して実行します。yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy を以前のエラー メッセージに含まれる未確定トランザクションの UOW に置き換えて実行します。To commit the transaction, update and run the following script - replace the yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy with the in-doubt transaction UOW from the previous error message, and run:

    KILL 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' WITH COMMIT
    
  • トランザクションをロールバックするには、次のスクリプトを更新して実行します。yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy を以前のエラー メッセージに含まれる未確定トランザクションの UOW に置き換えて実行します。To roll back the transaction, update and run the following script - replace the yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy with the in-doubt transaction UOW from the previous error message, and run:

    KILL 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' WITH ROLLBACK
    

トランザクションをコミットまたはロールバックした後は、ALTER DATABASE を使ってデータベースをオンラインに設定できます。After you commit or roll back the transaction, you can use ALTER DATABASE to set the database online. 次のスクリプトを更新して実行します。データベース名には、問題のあるデータベースの名前を設定します。Update and run the following script - set the database name for the name of the suspect database:

ALTER DATABASE [DB1] SET ONLINE

未確定トランザクションの解決について詳しくは、「トランザクションを手動で解決する」をご覧ください。For more information about resolving in-doubt transactions, see Resolve Transactions Manually.

次の手順Next Steps

分散トランザクションDistributed Transactions

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

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

XA トランザクションのサポートSupporting XA Transactions

動作のしくみ: DTC トランザクションのセッション/SPID (–2)How It Works: Session/SPID (–2) for DTC Transactions