BEGIN TRANSACTION (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric のウェアハウス
明示的なローカル トランザクションの開始位置をマークします。 明示的なトランザクションは、BEGIN TRANSACTION ステートメントで始まり、COMMIT または ROLLBACK ステートメントで終了します。
構文
--Applies to SQL Server and Azure SQL Database
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
--Applies to Synpase Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse
BEGIN { TRAN | TRANSACTION }
[ ; ]
Note
SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
transaction_name
適用対象: SQL Server 2008 (10.0.x) 以降、Azure SQL Database
トランザクションに割り当てられた名前を指定します。 transaction_name は識別子の規則に従っている必要があり、32 文字以内で指定する必要があります。 トランザクション名は、入れ子にされた BEGIN...COMMIT ステートメントまたは BEGIN...ROLLBACK ステートメントの最も外側の組だけに使用します。 SQL Server のインスタンスで大文字と小文字が区別されない場合であっても、transaction_name では常に大文字と小文字が区別されます。
@tran_name_variable
適用対象: SQL Server 2008 (10.0.x) 以降、Azure SQL Database
有効なトランザクション名を格納しているユーザー定義変数の名前を指定します。 変数は、char、varchar、nchar、または nvarchar データ型を使用して宣言する必要があります。 変数に 32 文字を超える文字が渡された場合は、最初の 32 文字だけが使用され、残りの文字は切り捨てられます。
WITH MARK [ 'description' ]
適用対象: SQL Server 2008 (10.0.x) 以降、Azure SQL Database
ログの中でトランザクションにマークを付けます。 description は、マーク名を示す文字列です。 description が 128 文字を超えている場合は、128 文字に切り捨てられてから msdb.dbo.logmarkhistory テーブルに格納されます。
WITH MARK を使用する場合は、トランザクション名を指定する必要があります。 WITH MARK によって、トランザクション ログを指定のマークに復元できます。
全般的な解説
BEGIN TRANSACTION によって @@TRANCOUNT が 1 だけ増えます。
BEGIN TRANSACTION は、接続で参照されるデータが論理的にも物理的にも一貫している位置を表します。 エラーが発生した場合は、BEGIN TRANSACTION 以降に加えられたすべてのデータ修正をロールバックし、一貫性が確認されている状態にデータを戻すことができます。 それぞれのトランザクションの終了時点は、エラーなく完了した場合は COMMIT TRANSACTION を実行して修正内容をデータベースに永久保存した時点になり、エラーが発生した場合は ROLLBACK TRANSACTION ステートメントですべての修正内容を消去した時点になります。
BEGIN TRANSACTION では、ステートメントを実行する接続のローカル トランザクションが開始されます。 この接続で実行される Transact-SQL ステートメントをサポートするため、トランザクションでは多くのリソースが取得されますが、これらのリソースは現在のトランザクション分離レベルの設定に応じてロックされ、COMMIT TRANSACTION または ROLLBACK TRANSACTION ステートメントのいずれかでトランザクションが完了するまでロックされたままになります。 トランザクションが完了するまでの間、他のユーザーはロックされたリソースにアクセスできなくなります。また、ログの切り捨ても行われません。
BEGIN TRANSACTION ではローカル トランザクションが開始されますが、これはその後アプリケーションで INSERT、UPDATE、DELETE ステートメントなど、ログへの記録が必要な操作が行われるまで、トランザクション ログに記録されません。 アプリケーションでは、ロックの取得などの操作を行って、SELECT ステートメントのトランザクション分離レベルを保護することができます。ただし、アプリケーションで変更操作が行われるまで、ログには何も記録されません。
1 つのトランザクション名で、何重にも入れ子になったトランザクション内の複数のトランザクションを指定しても、トランザクションに影響はほとんどありません。 システムに登録されるのは、最初の (最も外側の) トランザクション名だけです。 他の名前にロールバックするとエラーが発生します。ただし、有効なセーブポイント名へのロールバックではエラーは発生しません。 このエラーが発生した場合、ロールバック前に実行されたステートメントは一切ロールバックされません。 ステートメントは、外側のトランザクションがロールバックされた場合にのみロールバックされます。
BEGIN TRANSACTION ステートメントがコミットまたはロールバックされる前に次の操作を実行すると、このステートメントで開始されたローカル トランザクションは、分散トランザクションにエスカレートされます。
リンク サーバー上のリモート テーブルを参照する INSERT、DELETE、または UPDATE ステートメントを実行する。 リンク サーバーへのアクセスに使用する OLE DB プロバイダーで ITransactionJoin インターフェイスがサポートされていない場合、INSERT、UPDATE、または DELETE ステートメントは失敗します。
REMOTE_PROC_TRANSACTIONS オプションが ON のときに、リモート ストアド プロシージャを呼び出す。
SQL Server のローカル コピーはトランザクションのコントローラーになり、Microsoft 分散トランザクション コーディネーター (MS DTC) を使用して分散トランザクションを管理します。
BEGIN DISTRIBUTED TRANSACTION を使用して、トランザクションを分散トランザクションとして明示的に実行できます。 詳細については、「BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)」を参照してください。
SET IMPLICIT_TRANSACTIONS が ON に設定されている場合、BEGIN TRANSACTION ステートメントは 2 つの入れ子構造のトランザクションを作成します。 詳細については、「SET IMPLICIT_TRANSACTIONS (Transact-SQL)」を参照してください
マーク付きのトランザクション
WITH MARK オプションを使用すると、トランザクション名がトランザクション ログに挿入されます。 データベースを以前の状態に復元する場合は、日付や時刻の代わりにマークが付いたトランザクションを使用できます。 詳細については、「マークされたトランザクションを使用して関連するデータベースを一貫した状態に復元する方法 (完全復旧モデル)」と「RESTORE (Transact-SQL)」を参照してください。
さらに、関連するデータベースのセットを論理的に一貫した状態に復元する必要がある場合は、トランザクション ログ マークが必要です。 分散トランザクションによって、関連するデータベースのトランザクション ログにマークを設定できます。 関連するデータベースのセットをこれらのマークに復元すると、トランザクションとして一貫性のあるデータベースのセットが作成されます。 関連するデータベースにマークを設定するには、特別な手順が必要です。
トランザクション ログにマークが設定されるのは、マーク付きのトランザクションによってデータベースが更新される場合のみです。 データを変更しないトランザクションには、マークは付きません。
BEGIN TRAN new_name WITH MARK は、マークが付いていない既存のトランザクション内で入れ子にできます。 この場合、トランザクションに既に割り当てられている名前に関係なく、new_name がトランザクションのマーク名になります。 次の例では、M2
がマーク名になります。
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
トランザクションを入れ子にしている場合、既にマークが付いているトランザクションにマークを付けようとすると、エラーではなく警告のメッセージが表示されます。
"BEGIN TRAN T1 WITH MARK ...;"
"UPDATE table1 ...;"
"BEGIN TRAN M2 WITH MARK ...;"
"Server:Msg 3920, Level 16, State 1, Line 3"
"WITH MARK オプションだけが最初の BEGIN TRAN WITH MARK ステートメントに適用されます。"
"オプションは無視されます。"
アクセス許可
public ロールのメンバーシップが必要です。
例
A. 明示的なトランザクションを使用します。
適用対象: SQL Server 2008 (10.0.x) 以降、Azure SQL Database、Azure Synapse Analytics、Parallel Data Warehouse
この例では、AdventureWorks を使用します。
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. トランザクションのロールバック
適用対象: SQL Server 2008 (10.0.x) 以降、Azure SQL Database、Azure Synapse Analytics、Parallel Data Warehouse
次の例では、トランザクションのロールバックの効果を示します。 この例で ROLLBACK ステートメントがロールバックされます、INSERT ステートメントでは、作成されたテーブルはそのまま残ります。
CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
ROLLBACK;
C. トランザクションの名前を指定する
適用対象: SQL Server 2008 (10.0.x) 以降、Azure SQL Database
次の例では、トランザクションの名前を指定する方法を示します。
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks2012;
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
D. トランザクションにマークを付ける
適用対象: SQL Server 2008 (10.0.x) 以降、Azure SQL Database
次の例では、トランザクションにマークを付ける方法を示します。 トランザクション CandidateDelete
にマークが付けられています。
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2012;
GO
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO
参照
BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)