次の方法で共有


ロールバックトランザクション(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

このステートメントは、明示的または暗黙的なトランザクションをトランザクションの先頭またはトランザクション内のセーブポイントにロールバックします。 ROLLBACK TRANSACTIONを使用して、トランザクションの開始時またはセーブポイントから行われたすべてのデータ変更を消去します。 ROLLBACK TRANSACTION では、トランザクションによって保持されているリソースも解放されます。

ローカル変数またはテーブル変数に加えられた変更は、このステートメントによって消去されません。

Transact-SQL 構文表記規則

Syntax

Microsoft Fabric の SQL Server、Azure SQL Database、Azure SQL Managed Instance、SQL Database の構文。

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

Fabric Data Warehouse、Azure Synapse Analytics、Parallel Data Warehouse Database の構文。

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

適用対象: SQL Server 2008 (10.0.x) 以降のバージョン、Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL データベース。

BEGIN TRANSACTIONを使用してトランザクションに割り当てられた名前。 transaction_name は識別子のルールに従っている必要があります。ただし、使用されるのはトランザクション名の先頭の 32 文字だけです。 内部トランザクションがある場合、 transaction_name は最も外側の BEGIN TRANSACTION ステートメントの名前である必要があります。 データベース エンジン インスタンスで大文字と小文字が区別されない場合でも、transaction_nameでは常に大文字と小文字が区別されます。

@tran_name_variable

適用対象: SQL Server 2008 (10.0.x) 以降のバージョン、Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL データベース。

有効なトランザクション名を含むユーザー定義変数の名前。 変数は、charvarcharnchar、または nvarchar データ型を使用して宣言する必要があります。

savepoint_name

します。 savepoint_name は、識別子のルールに従っている必要があります。 ロールバック セーブポイントの後のトランザクションの一部にのみ影響する必要がある場合は、savepoint_nameを使用します。

@savepoint_variable

有効なセーブポイント名を含むユーザー定義変数の名前。 変数は、charvarcharnchar、または nvarchar データ型を使用して宣言する必要があります。

エラー処理

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

Remarks

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

ROLLBACK TRANSACTIONは、BEGIN DISTRIBUTED TRANSACTIONを使用して明示的に開始された分散トランザクションまたはローカル トランザクションから昇格された分散トランザクションのsavepoint_nameを参照できません。

COMMIT TRANSACTIONがロールバックされるトランザクション内に含まれる内部トランザクションに関連付けられている場合を除き、COMMIT TRANSACTION ステートメントの実行後にトランザクションをロールバックすることはできません。 この場合、内部トランザクションは、 COMMIT TRANSACTION を発行した場合でもロールバックされます。

トランザクション内では、重複するセーブポイント名が許可されますが、重複するセーブポイント名を使用する ROLLBACK TRANSACTION は、そのセーブポイント名を使用する最新の SAVE TRANSACTION にのみロールバックされます。

データベース エンジンは、個別に管理可能な入れ子になったトランザクションをサポートしていません。 内部トランザクションのコミットは @@TRANCOUNT デクリメントされますが、他の影響はありません。 セーブポイントが存在し、ROLLBACK ステートメントで指定されていない限り、内部トランザクションのロールバックは常に外部トランザクションをロールバックします。

Interoperability

ストアド プロシージャでは、savepoint_nameまたはtransaction_nameを持たないROLLBACK TRANSACTION ステートメントは、すべてのステートメントを最も外側のBEGIN TRANSACTIONにロールバックします。 プロシージャの完了時に@@TRANCOUNTがプロシージャの開始時の値とは異なる値を持つストアド プロシージャ内のROLLBACK TRANSACTION ステートメントは、情報メッセージを生成します。 このメッセージは、後続の処理には影響しません。

トリガーで ROLLBACK TRANSACTION が発行された場合:

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

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

  • トリガーを発生させたステートメントの後のバッチ内のステートメントは実行されません。

@@TRANCOUNT は、自動コミット モードの場合でも、トリガーを入力するときに 1 ずつインクリメントされます。 システムは、トリガーを暗黙的な内部トランザクションとして扱います。

ストアド プロシージャ内の ROLLBACK TRANSACTION ステートメントは、プロシージャを呼び出したバッチ内の後続のステートメントには影響しません。 バッチ内の後続のステートメントが実行されます。

トリガー内の ROLLBACK TRANSACTION ステートメントは、トリガーを起動したステートメントを含むバッチを終了します。 バッチ内の後続のステートメントは実行されません。

カーソルに対する ROLLBACK の影響は、次の規則によって定義されます。

  • CURSOR_CLOSE_ON_COMMITON に設定すると、ROLLBACKは閉じますが、開いているすべてのカーソルの割り当てが解除されることはありません。

  • CURSOR_CLOSE_ON_COMMITOFF に設定すると、ROLLBACKは、開いている同期STATICINSENSITIVEカーソル、または完全に設定された非同期STATIC カーソルには影響しません。 他のタイプのオープン カーソルは、クローズしますが、割り当ては解除されません。

  • バッチを終了し、トランザクションをロールバックするエラーは、エラーを生成するステートメントを含むバッチで宣言されたすべてのカーソルの割り当てを解除します。 カーソルの種類や CURSOR_CLOSE_ON_COMMITの設定に関係なく、すべてのカーソルの割り当てが解除されます。 これには、エラーを生成するバッチによって呼び出されるストアド プロシージャで宣言されたカーソルが含まれます。 エラーを生成するバッチの前にバッチで宣言されたカーソルには、前の 2 つの規則が適用されます。

    デッドロックは、この種類のエラーの例です。 トリガーで発行された ROLLBACK ステートメントでも、この動作が発生します。

ロック動作

savepoint_nameを指定するROLLBACK TRANSACTION ステートメントは、エスカレートされたロックと変換されたロックを除き、セーブポイントを超えて取得されたすべてのロックを解放します。 これらのロックは解放されず、以前のロック モードに変換されません。

Permissions

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

Examples

次の例では、名前付きトランザクションをロールバックした場合の影響を示します。 テーブルを作成した後、次のステートメントは名前付きトランザクションを開始し、2 つの行を挿入してから、変数 @TransactionNameで指定されたトランザクションをロールバックします。 名前付きトランザクション外の外側にあるもう 1 つのステートメントで 2 行が挿入されます。 クエリによって、前のステートメントの結果が返されます。

USE tempdb;
CREATE TABLE ValueTable
(
    value INT
);

DECLARE @TransactionName AS VARCHAR (20) = 'Transaction1';

BEGIN TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

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

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

結果セットは次のとおりです。

value
-----
3
4