BEGIN TRANSACTION (Transact-SQL)

明示的なローカル トランザクションの開始位置をマークします。BEGIN TRANSACTION によって @@TRANCOUNT が 1 だけ増えます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

BEGIN { TRAN | TRANSACTION } 
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

引数

  • transaction_name
    トランザクションに割り当てられた名前を指定します。transaction_name は識別子の規則に従っている必要があり、32 文字以内で指定する必要があります。トランザクション名は、入れ子になった BEGIN...COMMIT ステートメントまたは BEGIN...ROLLBACK ステートメントの最も外側の組だけに使用します。

  • @tran_name_variable
    有効なトランザクション名を格納しているユーザー定義変数の名前を指定します。この変数は、char 型、varchar 型、nchar 型、または nvarchar 型で宣言する必要があります。変数に 32 文字を超える文字が渡された場合は、最初の 32 文字だけが使用され、残りの文字は切り捨てられます。

  • WITH MARK [ 'description' ]
    ログの中でトランザクションにマークを付けます。description は、マークを説明する文字列です。128 文字より長い description 値は 128 文字に切り捨てられてから msdb.dbo.logmarkhistory テーブルに格納されます。

    WITH MARK を使用する場合は、トランザクション名を指定する必要があります。WITH MARK によって、トランザクション ログを指定のマークに復元できます。

説明

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 オプションがオンのときに、リモート ストアド プロシージャを呼び出す。

SQL Server のローカル コピーはトランザクションのコントローラーになり、Microsoft 分散トランザクション コーディネーター (MS DTC) を使用して分散トランザクションを管理します。

BEGIN DISTRIBUTED TRANSACTION を使用して、トランザクションを分散トランザクションとして明示的に実行できます。詳細については、「BEGIN DISTRIBUTED TRANSACTION (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 ...;"

"サーバー: メッセージ 3920、レベル 16、状態 1、行 3"

"WITH MARK オプションだけが最初の BEGIN TRAN WITH MARK ステートメントに適用されます。"

"オプションは無視されます。"

権限

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

A. トランザクションの名前を指定する

次の例では、トランザクションの名前を指定する方法を示します。

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2008R2;
DELETE FROM AdventureWorks2008R2.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

B. トランザクションにマークを付ける

次の例では、トランザクションにマークを付ける方法を示します。マークを付けるトランザクションは CandidateDelete です。

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2008R2;
GO
DELETE FROM AdventureWorks2008R2.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO