ROLLBACK TRANSACTION (Transact-SQL)

明示的または暗黙的なトランザクションを、トランザクションの開始位置またはトランザクション内のセーブポイントまでロールバックします。

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

構文

ROLLBACK { TRAN | TRANSACTION } 
     [ transaction_name | @tran_name_variable
     | savepoint_name | @savepoint_variable ] 
[ ; ]

引数

  • transaction_name
    BEGIN TRANSACTION においてトランザクションに割り当てられた名前です。transaction_name は、識別子のルールに従っている必要があります。ただし、使用されるのはトランザクション名の先頭の 32 文字だけです。トランザクションを入れ子にしている場合は、transaction_name は最も外側の BEGIN TRANSACTION ステートメントの名前である必要があります。

  • **@**tran_name_variable
    有効なトランザクション名を格納しているユーザー定義変数の名前です。この変数は、char 型、varchar 型、nchar 型、または nvarchar 型で宣言する必要があります。

  • savepoint_name
    SAVE TRANSACTION ステートメントの savepoint_name です。savepoint_name は、識別子のルールに従っている必要があります。savepoint_name は、条件付きのロールバックがトランザクションの一部にしか影響しない場合に使用します。

  • **@**savepoint_variable
    有効なセーブポイント名を格納しているユーザー定義変数の名前です。この変数は、char 型、varchar 型、nchar 型、または nvarchar 型で宣言する必要があります。

説明

ROLLBACK TRANSACTION は、トランザクションの開始またはセーブポイント発行時点以降に行われたすべてのデータ変更を消去します。トランザクションが保持していたリソースも解放されます。

savepoint_name または transaction_name を指定せずに ROLLBACK TRANSACTION を実行すると、トランザクションの先頭までロールバックします。トランザクションを入れ子にしている場合は、同じステートメントが、内部のすべてのトランザクションを、最も外側の BEGIN TRANSACTION ステートメントにロールバックします。どちらの場合も、ROLLBACK TRANSACTION では @@TRANCOUNT システム関数が 0 に減らされます。ROLLBACK TRANSACTION savepoint_name で @@TRANCOUNT が減少することはありません。

ROLLBACK TRANSACTION ステートメントで savepoint_name を指定している場合、そのセーブポイントより後の時点で取得されたロックは解放されます。ただし、エスカレーションおよび変換が行われた場合、これらのロックは解放されず、前のロック モードに戻ることはありません。

ROLLBACK TRANSACTION では、BEGIN DISTRIBUTED TRANSACTION によって明示的にまたはローカル トランザクションのエスカレートにより開始された分散型トランザクション内の savepoint_name は参照できません。

COMMIT TRANSACTION ステートメントの実行後は、トランザクションをロールバックできません。

トランザクションの中で、同じセーブポイント名を重複して指定することができます。しかし、重複するセーブポイント名を使用する ROLLBACK TRANSACTION は、そのセーブポイント名を使用する最新の SAVE TRANSACTION にしかロールバックできません。

ストアド プロシージャの中で、savepoint_name または transaction_name を指定せずに ROLLBACK TRANSACTION ステートメントを実行すると、すべてのステートメントが最も外側の BEGIN TRANSACTION までロールバックされます。ROLLBACK TRANSACTION ステートメントを実行するストアド プロシージャで、終了時の @@TRANCOUNT の値と呼び出し時の @@TRANCOUNT の値が異なる場合は、情報メッセージが出力されます。このメッセージが出力されても、その後の処理に影響はありません。

ROLLBACK TRANSACTION がトリガ内で実行された場合

  • 現在のトランザクションのその時点までに加えられたすべてのデータ変更 (トリガによって行われた変更も含む) がロールバックされます。

  • ROLLBACK ステートメントの実行後、トリガは残りのすべてのステートメントを継続して実行します。これらのステートメントのいずれかがデータを変更する場合、その変更はロールバックされません。残りのステートメントを実行しても入れ子にしたトリガは起動されません。

  • トリガを起動したステートメントの後で、バッチ内のステートメントは実行されません。

@@TRANCOUNT は、自動コミット モードの場合であっても、トリガに入るたびに 1 ずつ増加します。つまり、トリガは暗黙の入れ子にされたトランザクションとして扱われます。

ストアド プロシージャで ROLLBACK TRANSACTION ステートメントを実行しても、そのプロシージャを呼び出したバッチ内にある次のステートメントには影響しません。トリガの中の ROLLBACK TRANSACTION ステートメントは、トリガを起動したステートメントを含むバッチを終了します。バッチ内の以降のステートメントは実行されません。

ROLLBACK TRANSACTION ステートメントでは、ユーザーに対するメッセージは生成されません。ストアド プロシージャまたはトリガで警告が必要な場合は、RAISERROR ステートメントまたは PRINT ステートメントを使用します。エラーを指示するには、RAISERROR ステートメントの方が適しています。

カーソル上での ROLLBACK の効果は、次の 3 つのルールによって定義されます。

  1. CURSOR_CLOSE_ON_COMMIT が ON の場合、ROLLBACK はオープンしているすべてのカーソルをクローズしますが、その割り当ては解除しません。

  2. CURSOR_CLOSE_ON_COMMIT を OFF に設定した場合、ROLLBACK は、オープンしていて同期している静的カーソルおよび非反映型カーソル、あるいは完全に生成されている非同期な静的カーソルのいずれにも影響しません。他のタイプのオープン カーソルは、クローズしますが、割り当ては解除されません。

  3. バッチを終了し、内部のロールバックを生成するエラーは、エラー ステートメントを含むバッチの中で宣言された、すべてのカーソルの割り当てを解除します。すべてのカーソルは、そのタイプや CURSOR_CLOSE_ON_COMMIT の設定にかかわらず、割り当てを解除されます。これには、エラー バッチによって呼び出されるストアド プロシージャで宣言されたカーソルも含まれます。エラー バッチの前にバッチ内で宣言されたカーソルは、ルール 1 および 2 に従います。このタイプのエラーの例としてはデッドロック エラーがあります。トリガの中で実行される ROLLBACK ステートメントも、このタイプのエラーを自動的に生成します。

ROLLBACK TRANSACTION を使用するコード例については、「入れ子構造のトランザクション」を参照してください。

権限

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

次の例は、名前付きトランザクションをロールバックした場合の影響を示しています。

USE TempDB;
GO

CREATE TABLE ValueTable ([value] int)
GO

DECLARE @TransactionName varchar(20) = 'Transaction1';

--These statements start a named transaction,
--insert a two records, and then roll back
--the transaction named in the variable 
--@TransactionName.
BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1)
       INSERT INTO ValueTable VALUES(2)
ROLLBACK TRAN @TransactionName

INSERT INTO ValueTable VALUES(3)
INSERT INTO ValueTable VALUES(4)

SELECT * FROM ValueTable

DROP TABLE ValueTable

--Results
--value
-------------
--3
--4