Transact-SQL 分散トランザクション

Transact-SQL で開始される分散トランザクションの構造は比較的単純です。

  1. Transact-SQL のスクリプトまたはアプリケーション接続によって、分散トランザクションを開始する Transact-SQL ステートメントが実行されます。

  2. ステートメントを実行する SQL Server データベース エンジン インスタンスが、トランザクションの制御サーバーになります。

  3. スクリプトまたはアプリケーションが、リンク サーバーに対して分散クエリを、またはリモート サーバーに対してリモート ストアド プロシージャを実行します。

  4. 分散クエリやリモート プロシージャ コールを実行すると、制御サーバーにより MS DTC (Microsoft 分散トランザクション コーディネータ) が自動的に呼び出され、リンク サーバーやリモート サーバーを分散トランザクションに参加させます。

  5. スクリプトまたはアプリケーションが COMMIT ステートメントまたは ROLLBACK ステートメントのいずれかを実行すると、制御サーバーである SQL Server インスタンスは MS DTC を呼び出し、2 フェーズ コミット処理を管理するか、リンク サーバーまたはリモート サーバーにトランザクションをロールバックするよう通知します。

必要な Transact-SQL ステートメント

大半の作業は SQL Server データベース エンジンおよび MS DTC によって内部的に行われるため、分散トランザクションを制御する Transact-SQL ステートメントはほとんどありません。Transact-SQL のスクリプトまたはアプリケーションでは、次の目的で使用する Transact-SQL ステートメントのみが必要です。

  • 分散トランザクションを開始する。

  • リンク サーバーに対して分散クエリを実行するか、リモート サーバーに対してリモート プロシージャ コールを実行する。

  • 標準の Transact-SQL ステートメントの COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION、または ROLLBACK WORK を呼び出してトランザクションを完了する。

    どの Transact-SQL 分散トランザクションでも、Transact-SQL のスクリプトまたは接続を処理するデータベース エンジン インスタンスによって MS DTC が自動的に呼び出され、トランザクションのコミットまたはロールバックを調整して実行します。

分散トランザクションの開始

Transact-SQL で分散トランザクションを開始するには、次の方法があります。

  • BEGIN DISTRIBUTED TRANSACTION ステートメントを使用して、明示的な分散トランザクションを開始します。

    リンク サーバーに対して分散クエリを実行することもできます。接続先のデータベース エンジン インスタンスは MS DTC を呼び出してリンク サーバーに対する分散トランザクションを管理します。分散トランザクションの一部として、リモートのデータベース エンジン インスタンスのリモート ストアド プロシージャを呼び出すこともできます。

  • ローカル トランザクションで分散クエリを実行します。

    OLE DB データ ソースで ITransactionJoin インターフェイスがサポートされている場合、読み取り専用クエリであってもトランザクションが分散トランザクションに昇格します。データ ソースで ITransactionJoin がサポートされていない場合、読み取り専用ステートメントのみを実行できます。

  • SET REMOTE_PROC_TRANSACTIONS ON を実行して、ローカル トランザクションから別のデータベース エンジン インスタンスのリモート ストアド プロシージャを呼び出した場合、そのローカル トランザクションは分散トランザクションに昇格します。

    データベース エンジンは MS DTC を使用してトランザクションとリモート サーバーを調整して実行します。REMOTE_PROC_TRANSACTIONS を OFF に設定すると、リモート ストアド プロシージャへの呼び出しがローカル トランザクションのスコープ外で実行されます。ローカル トランザクションがロールバックされても、リモート プロシージャが実行した作業はロールバックされません。リモート ストアド プロシージャが実行した作業は、ローカル トランザクションのコミット時ではなくプロシージャの完了時にコミットされます。

REMOTE_PROC_TRANSACTIONS オプションは、sp_addserver を使用して定義されたリモート サーバーに対して行われるリモート ストアド プロシージャへの呼び出しのみに影響を及ぼす互換性オプションです。このオプションは sp_addlinkedserver で定義されたリンク サーバーでストアド プロシージャを実行する分散クエリには適用されません。分散クエリの詳細については、「分散クエリ」を参照してください。