BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

適用対象: SQL ServerAzure SQL Managed Instance

Transact-SQL 分散トランザクションの開始を指定します。 SQL Server を使用する場合、分散トランザクションは Microsoft 分散トランザクション コーディネーター (MS DTC) によって管理されます。

Transact-SQL 構文表記規則

構文

BEGIN DISTRIBUTED { TRAN | TRANSACTION }
     [ transaction_name | @tran_name_variable ]
[ ; ]

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

transaction_name

MS DTC ユーティリティ内で分散管理トランザクションの追跡に使用する、ユーザー定義のトランザクション名を指定します。 transaction_name は識別子の規則に従っている必要があり、<= 32 文字で指定する必要があります。

@tran_name_variable

MS DTC ユーティリティ内で分散管理トランザクションの追跡に使用するトランザクション名を含む、ユーザー定義の変数名を指定します。 変数は、charvarcharnchar、または nvarchar データ型を使用して宣言する必要があります。

解説

BEGIN DISTRIBUTED TRANSACTION ステートメントを実行する SQL Server データベース エンジン インスタンスは、トランザクションの発行元となり、トランザクションの完了を制御します。 このセッションで後続の COMMIT TRANSACTION または ROLLBACK TRANSACTION ステートメントを実行すると、制御側のインスタンスから MS DTC に対して、関係する全インスタンス間の分散トランザクションの完了を管理するように要求されます。

トランザクション レベルのスナップショット分離では、分散トランザクションはサポートされません。

データベース エンジン のリモート インスタンスが分散トランザクションに参加するのは、主として、分散トランザクションに既に参加しているセッションで、リンク サーバーを参照する分散クエリが実行された場合です。

たとえば、BEGIN DISTRIBUTED TRANSACTION が ServerA で実行されると、そのセッションでは ServerB のストアド プロシージャと ServerC のストアド プロシージャが呼び出されます。 ServerC のストアド プロシージャでは ServerD に対して分散クエリが実行され、この結果、4 台のコンピューターすべてが分散トランザクションに参加します。 ServerA のデータベース エンジン インスタンスは、トランザクションの発行元の制御インスタンスになります。

Transact-SQL 分散トランザクションに含まれているセッションでは、分散トランザクションへの明示的な参加を目的とした、別のセッションに渡すことのできるトランザクション オブジェクトは取得されません。 リモート サーバーがトランザクションに参加できるのは、リモート サーバーが分散クエリまたはリモート ストアド プロシージャ コールの対象になる場合だけです。

ローカル トランザクション内で分散クエリを実行するとき、クエリの対象である OLE DB データ ソースで ITransactionLocal がサポートされている場合は、トランザクションは自動的に分散トランザクションに昇格します。 クエリの対象である OLE DB データ ソースで ITransactionLocal がサポートされていない場合は、分散クエリで読み取り専用操作だけが許可されます。

分散トランザクションに既に参加しているセッションでは、リモート サーバーを参照するリモート ストアド プロシージャが実行されます。

sp_configure remote proc trans オプションを使用すると、ローカル トランザクション内のリモート ストアド プロシージャを呼び出したときに、自動的にローカル トランザクションを MS DTC 管理の分散トランザクションに昇格させるかどうかを制御できます。 接続レベルの SET オプション REMOTE_PROC_TRANSACTIONS を使用した場合は、sp_configure remote proc trans で設定されたインスタンスの既定値をオーバーライドできます。 このオプションをオンに設定した状態でリモート ストアド プロシージャを呼び出すと、ローカル トランザクションは分散トランザクションに昇格します。 この場合、MS DTC トランザクションを作成した接続がトランザクションの発行元になります。 COMMIT TRANSACTION では、MS DTC により調整されるコミットが開始されます。 sp_configure remote proc trans オプションを ON に設定した場合、ローカル トランザクション内のリモート ストアド プロシージャ コールは分散トランザクションの一部として自動的に保護されます。特別に BEGIN TRANSACTION の代わりに BEGIN DISTRIBUTED TRANSACTION を実行するようアプリケーションを書き換える必要はありません。

分散トランザクションの環境と処理の詳細については、Microsoft 分散トランザクション コーディネーターのマニュアルを参照してください。

アクセス許可

public ロールのメンバーシップが必要です。

次の例では、データベース エンジンのローカル インスタンスとリモート サーバーのインスタンス両方で、AdventureWorks2022 データベースから候補者を削除します。 ローカルとリモートの両方のデータベースで、トランザクションのコミットまたはロールバックのいずれかが実行されます。

Note

データベース エンジン インスタンスが動作しているコンピューターに現在 MS DTC がインストールされていない場合、この例を実行するとエラー メッセージが出力されます。 MS DTC のインストールの詳細については、Microsoft 分散トランザクション コーディネーターのマニュアルを参照してください。

USE AdventureWorks2022;
GO
BEGIN DISTRIBUTED TRANSACTION;
-- Delete candidate from local instance.
DELETE AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
-- Delete candidate from remote instance.
DELETE RemoteServer.AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
GO

次のステップ