分散トランザクション (データベース エンジン)

分散トランザクションは、リソース マネージャと呼ばれる複数のサーバーに展開されます。トランザクションの管理はリソース マネージャ間で、トランザクション マネージャと呼ばれるサーバー コンポーネントが調整する必要があります。Microsoft 分散トランザクション コーディネータ (MS DTC) などのトランザクション マネージャ、または分散トランザクション処理に関する Open Group XA 仕様をサポートするその他のトランザクション マネージャによって調整される分散トランザクションでは、SQL Server データベース エンジンをリソース マネージャとして操作できます。詳細については、MS DTC のドキュメントを参照してください。

複数のデータベースにまたがる 1 つのデータベース エンジン内のトランザクションは実質的には分散トランザクションです。ただし、SQL Server インスタンスは分散トランザクションを内部で処理するため、ユーザーにはローカル トランザクションとして動作しているように見えます。

アプリケーションでは、分散トランザクションはローカル トランザクションとほぼ同様に管理されます。トランザクションの終了時に、アプリケーションがトランザクションのコミットまたはロールバックを要求します。ただし、トランザクション マネージャが分散コミットを別の方法で管理することによって、ネットワーク障害により一部のリソース マネージャがトランザクションを正常にコミットし、その一方で他のリソース マネージャがトランザクションをロールバックするという危険性を最小限に抑える必要があります。このため、コミット処理を準備フェーズとコミット フェーズの 2 フェーズで管理します。これを 2PC (2 フェーズ コミット) と呼びます。

  • 準備フェーズ
    トランザクション マネージャはコミット要求を受け取ると、そのトランザクションに関連するすべてのリソース マネージャに準備コマンドを送ります。各リソース マネージャは、トランザクションを持続的にするために必要な処理をすべて実行し、そのトランザクションのログ イメージを含むすべてのバッファをディスクにフラッシュします。リソース マネージャの準備フェーズが完了すると、トランザクション マネージャに準備の成否が通知されます。

  • コミット フェーズ
    トランザクション マネージャは、すべてのリソース マネージャから準備の正常完了通知を受け取ると、リソース マネージャにコミット コマンドを送ります。これにより、リソース マネージャはコミットを完了できます。すべてのリソース マネージャがコミットの正常完了を報告した場合、トランザクション マネージャは、アプリケーションに成功通知を送ります。準備できなかったことを報告するリソース マネージャがあった場合、トランザクション マネージャはすべてのリソース マネージャにロールバック コマンドを送り、アプリケーションにコミットできなかったことを報告します。

データベース エンジン アプリケーションは分散トランザクションの管理に Transact-SQL またはデータベース API のどちらも使用できます。