ROLLBACK TRANSACTION (Transact-SQL)ROLLBACK TRANSACTION (Transact-SQL)

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database ouiAzure SQL Data Warehouse ouiParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Annule une transaction implicite ou explicite jusqu'au début de la transaction ou jusqu'au dernier point d'enregistrement à l'intérieur de la transaction.Rolls back an explicit or implicit transaction to the beginning of the transaction, or to a savepoint inside the transaction. Vous pouvez utiliser ROLLBACK TRANSACTION pour effacer toutes les modifications de données effectuées depuis le début de la transaction ou à partir d'un point d'enregistrement.You can use ROLLBACK TRANSACTION to erase all data modifications made from the start of the transaction or to a savepoint. Elle libère également les ressources bloquées par la transaction.It also frees resources held by the transaction.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

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

ArgumentsArguments

transaction_nametransaction_name
Nom attribué à la transaction dans BEGIN TRANSACTIONIs the name assigned to the transaction on BEGIN TRANSACTION. transaction_name doit respecter les règles applicables aux identificateurs, mais seuls les 32 premiers caractères du nom de la transaction sont utilisés.transaction_name must conform to the rules for identifiers, but only the first 32 characters of the transaction name are used. En cas d’imbrication des transactions, transaction_name doit correspondre au nom figurant dans l’instruction BEGIN TRANSACTION la plus extérieure.When nesting transactions, transaction_name must be the name from the outermost BEGIN TRANSACTION statement. transaction_name respecte toujours la casse, même si l’instance de SQL ServerSQL Server n’en tient pas compte.transaction_name is always case-sensitive, even when the instance of SQL ServerSQL Server is not case-sensitive.

@ tran_name_variable@ tran_name_variable
Nom d'une variable définie par l'utilisateur et contenant un nom de transaction valide.Is the name of a user-defined variable containing a valid transaction name. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type.

savepoint_namesavepoint_name
savepoint_name d’une instruction SAVE TRANSACTION.Is savepoint_name from a SAVE TRANSACTION statement. savepoint_name doit suivre les règles applicables aux identificateurs.savepoint_name must conform to the rules for identifiers. Utilisez savepoint_name quand une restauration conditionnelle ne doit affecter qu’une partie de la transaction.Use savepoint_name when a conditional rollback should affect only part of the transaction.

@ savepoint_variable@ savepoint_variable
Nom d'une variable définie par l'utilisateur et contenant un nom de point d'enregistrement valide.Is name of a user-defined variable containing a valid savepoint name. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type.

Gestion des erreursError Handling

Une instruction ROLLBACK TRANSACTION n'envoie aucun message à l'utilisateur.A ROLLBACK TRANSACTION statement does not produce any messages to the user. Si des avertissements sont nécessaires dans les procédures stockées ou les déclencheurs, utilisez les instructions RAISERROR ou PRINT.If warnings are needed in stored procedures or triggers, use the RAISERROR or PRINT statements. L'instruction RAISERROR est la mieux adaptée à l'indication des erreurs.RAISERROR is the preferred statement for indicating errors.

Remarques d'ordre généralGeneral Remarks

L’instruction ROLLBACK TRANSACTION sans savepoint_name ni transaction_name permet de restaurer la transaction à son début.ROLLBACK TRANSACTION without a savepoint_name or transaction_name rolls back to the beginning of the transaction. En cas d'imbrication des transactions, cette même instruction annule toutes les transactions internes jusqu'à l'instruction BEGIN TRANSACTION la plus extérieure.When nesting transactions, this same statement rolls back all inner transactions to the outermost BEGIN TRANSACTION statement. Dans les deux cas, ROLLBACK TRANSACTION décrémente la fonction système @@TRANCOUNT jusqu’à 0.In both cases, ROLLBACK TRANSACTION decrements the @@TRANCOUNT system function to 0. ROLLBACK TRANSACTION savepoint_name ne décrémente pas @@TRANCOUNT.ROLLBACK TRANSACTION savepoint_name does not decrement @@TRANCOUNT.

ROLLBACK TRANSACTION ne peut pas faire référence à un savepoint_name dans les transactions distribuées lancées soit explicitement avec BEGIN DISTRIBUTED TRANSACTION, soit découlant d’une transaction locale.ROLLBACK TRANSACTION cannot reference a savepoint_name in distributed transactions started either explicitly with BEGIN DISTRIBUTED TRANSACTION or escalated from a local transaction.

Une transaction ne peut pas être annulée après l'exécution d'une instruction COMMIT TRANSACTION, sauf lorsque l'instruction COMMIT TRANSACTION est associée à une transaction imbriquée qui est contenue dans la transaction restaurée.A transaction cannot be rolled back after a COMMIT TRANSACTION statement is executed, except when the COMMIT TRANSACTION is associated with a nested transaction that is contained within the transaction being rolled back. Dans cette instance, la transaction imbriquée est restaurée, même si vous avez émis une instruction COMMIT TRANSACTION.In this instance, the nested transaction is rolled back, even if you have issued a COMMIT TRANSACTION for it.

Dans une transaction, les noms de point d'enregistrement dupliqués sont autorisés. Toutefois, une instruction ROLLBACK TRANSACTION contenant un nom de point d'enregistrement en double n'effectue l'annulation que jusqu'à l'instruction SAVE TRANSACTION la plus récente utilisant ce nom de point d'enregistrement.Within a transaction, duplicate savepoint names are allowed, but a ROLLBACK TRANSACTION using the duplicate savepoint name rolls back only to the most recent SAVE TRANSACTION using that savepoint name.

InteropérabilitéInteroperability

Dans les procédures stockées, les instructions ROLLBACK TRANSACTION sans savepoint_name ni transaction_name annulent toutes les instructions jusqu’à l’instruction BEGIN TRANSACTION la plus extérieure.In stored procedures, ROLLBACK TRANSACTION statements without a savepoint_name or transaction_name roll back all statements to the outermost BEGIN TRANSACTION. Une instruction ROLLBACK TRANSACTION dans une procédure stockée qui modifie la @@TRANCOUNT valeur de @@TRANCOUNT entre le moment où la procédure stockée se termine et celui où la procédure a été appelée, génère un message d’information.A ROLLBACK TRANSACTION statement in a stored procedure that causes @@TRANCOUNT to have a different value when the stored procedure completes than the @@TRANCOUNT value when the stored procedure was called produces an informational message. Ce message n'affecte pas la suite du traitement.This message does not affect subsequent processing.

L'exécution d'une instruction ROLLBACK TRANSACTION dans un déclencheur a les conséquences suivantes :If a ROLLBACK TRANSACTION is issued in a trigger:

  • toutes les modifications de données effectuées jusque là dans la transaction en cours sont annulées, y compris celles effectuées par le déclencheur ;All data modifications made to that point in the current transaction are rolled back, including any made by the trigger.

  • le déclencheur termine l'exécution des instructions qui suivent l'instruction ROLLBACK.The trigger continues executing any remaining statements after the ROLLBACK statement. Si l'une de ces instructions modifie les données, les modifications ne sont pas annulées.If any of these statements modify data, the modifications are not rolled back. Aucun déclencheur imbriqué ne peut être activé par l'exécution de ces instructions ;No nested triggers are fired by the execution of these remaining statements.

  • aucune instruction du traitement suivant celle qui a activé le déclencheur n'est exécutée.The statements in the batch after the statement that fired the trigger are not executed.

@@TRANCOUNT est incrémenté de un lorsqu’un déclencheur est entré, même en mode de validation automatique.@@TRANCOUNT is incremented by one when entering a trigger, even when in autocommit mode. (Le système traite un déclencheur comme une transaction imbriquée implicite).(The system treats a trigger as an implied nested transaction.)

Les instructions ROLLBACK TRANSACTION contenues dans des procédures stockées n'affectent pas les instructions suivantes dans le traitement qui a appelé la procédure ; les instructions suivantes du traitement sont exécutées.ROLLBACK TRANSACTION statements in stored procedures do not affect subsequent statements in the batch that called the procedure; subsequent statements in the batch are executed. Les instructions ROLLBACK TRANSACTION figurant dans des déclencheurs terminent le traitement contenant l'instruction qui a activé le déclencheur ; les instructions suivantes du traitement ne sont pas exécutées.ROLLBACK TRANSACTION statements in triggers terminate the batch containing the statement that fired the trigger; subsequent statements in the batch are not executed.

Les effets d'une instruction ROLLBACK sur les curseurs sont définis par les trois règles suivantes :The effect of a ROLLBACK on cursors is defined by these three rules:

  1. avec CURSOR_CLOSE_ON_COMMIT à ON, ROLLBACK ferme tous les curseurs ouverts, sans les désallouer ;With CURSOR_CLOSE_ON_COMMIT set ON, ROLLBACK closes, but does not deallocate all open cursors.

  2. avec CURSOR_CLOSE_ON_COMMIT à OFF, ROLLBACK n'affecte ni les curseurs synchrones STATIC ou INSENSITIVE ouverts, ni les curseurs STATIC asynchrones entièrement remplis.With CURSOR_CLOSE_ON_COMMIT set OFF, ROLLBACK does not affect any open synchronous STATIC or INSENSITIVE cursors or asynchronous STATIC cursors that have been fully populated. Quel que soit leur type, les curseurs ouverts sont fermés mais pas désalloués ;Open cursors of any other type are closed but not deallocated.

  3. une erreur qui termine un traitement et génère une annulation interne provoque la désallocation de tous les curseurs qui étaient déclarés dans le traitement contenant l'instruction erronée.An error that terminates a batch and generates an internal rollback deallocates all cursors that were declared in the batch containing the error statement. Tous les curseurs sont désalloués, quel que soit leur type ou le paramétrage de CURSOR_CLOSE_ON_COMMIT.All cursors are deallocated regardless of their type or the setting of CURSOR_CLOSE_ON_COMMIT. Cela inclut les curseurs déclarés dans les procédures stockées appelées par le traitement qui a provoqué l'erreur.This includes cursors declared in stored procedures called by the error batch. Les curseurs déclarés dans un traitement précédant le traitement erroné sont soumis aux règles 1 et 2.Cursors declared in a batch before the error batch are subject to rules 1 and 2. Un blocage est un exemple de ce type d'erreur.A deadlock error is an example of this type of error. Une instruction ROLLBACK exécutée dans un déclencheur génère aussi automatiquement ce type d'erreur.A ROLLBACK statement issued in a trigger also automatically generates this type of error.

Comportement de verrouillageLocking Behavior

Une instruction ROLLBACK TRANSACTION spécifiant un savepoint_name libère tous les verrous acquis au-delà du point de sauvegarde, à l’exception des promotions et des conversions.A ROLLBACK TRANSACTION statement specifying a savepoint_name releases any locks that are acquired beyond the savepoint, with the exception of escalations and conversions. Ces verrous ne sont pas libérés et ne sont pas reconvertis dans leur ancien mode de verrouillage.These locks are not released, and they are not converted back to their previous lock mode.

AutorisationsPermissions

Nécessite l'appartenance au rôle public .Requires membership in the public role.

ExemplesExamples

L'exemple suivant montre l'effet de la restauration d'une transaction nommée.The following example shows the effect of rolling back a named transaction. Après avoir créé une table, les instructions suivantes démarrent une transaction nommée, insérent deux lignes, puis restaurent la transaction nommée dans la variable @TransactionName.After creating a table, the following statements start a named transaction, insert two rows, and then roll back the transaction named in the variable @TransactionName. Une autre instruction en dehors de la transaction nommée insère deux lignes.Another statement outside of the named transaction inserts two rows. La requête retourne les résultats des instructions précédentes.The query returns the results of the previous statements.

USE tempdb;  
GO  
CREATE TABLE ValueTable ([value] int);  
GO  
  
DECLARE @TransactionName varchar(20) = 'Transaction1';  
  
BEGIN TRAN @TransactionName  
       INSERT INTO ValueTable VALUES(1), (2);  
ROLLBACK TRAN @TransactionName;  
  
INSERT INTO ValueTable VALUES(3),(4);  
  
SELECT [value] FROM ValueTable;  
  
DROP TABLE ValueTable;  

Voici l'ensemble des résultats.Here is the result set.

value  
-----   
3    
4  

Voir aussiSee Also

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL) BEGIN TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL) COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL) COMMIT WORK (Transact-SQL)
ROLLBACK WORK (Transact-SQL) ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)SAVE TRANSACTION (Transact-SQL)