BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
適用対象: SQL Server Azure SQL Managed Instance
Transact-SQL 分散トランザクションの開始を指定します。 SQL Server を使用する場合、分散トランザクションは Microsoft 分散トランザクション コーディネーター (MS DTC) によって管理されます。
- Azure SQL Managed Instance では、分散トランザクションは MS DTC ではなくサービス自体で管理されます。 Azure SQL Database および Azure SQL Managed Instance での分散トランザクションの詳細については、「クラウド データベースにまたがる分散トランザクション」を参照してください。
構文
BEGIN DISTRIBUTED { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable ]
[ ; ]
引数
transaction_name
MS DTC ユーティリティ内で分散管理トランザクションの追跡に使用する、ユーザー定義のトランザクション名を指定します。 transaction_name は識別子の規則に従っている必要があり、<= 32 文字で指定する必要があります。
@tran_name_variable
MS DTC ユーティリティ内で分散管理トランザクションの追跡に使用するトランザクション名を含む、ユーザー定義の変数名を指定します。 変数は、char、varchar、nchar、または 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