Partager via


ROLLBACK TRANSACTION (Transact-SQL)

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. 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. Elle libère également les ressources bloquées par la transaction.

Icône Lien de rubrique Conventions de la syntaxe Transact-SQL

Syntaxe

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

Arguments

  • transaction_name
    Nom attribué à la transaction dans 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. En cas d'imbrication des transactions,transaction_name doit correspondre au nom figurant dans l'instruction BEGIN TRANSACTION la plus extérieure.

  • **@**tran_name_variable
    Nom d'une variable définie par l'utilisateur et contenant un nom de transaction valide. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar.

  • savepoint_name
    savepoint_name issu d'une instruction SAVE TRANSACTION. savepoint_name doit être conforme aux règles applicables aux identificateurs. Employez savepoint_name lorsqu'une opération d'annulation conditionnelle ne doit affecter qu'une partie de la transaction.

  • **@**savepoint_variable
    Nom d'une variable définie par l'utilisateur et contenant un nom de point d'enregistrement valide. La variable doit être déclarée avec le type de données char, varchar, nchar ou nvarchar.

Gestion des erreurs

Une instruction ROLLBACK TRANSACTION n'envoie aucun message à l'utilisateur. Si des avertissements sont nécessaires dans les procédures stockées ou les déclencheurs, utilisez les instructions RAISERROR ou PRINT. L'instruction RAISERROR est la mieux adaptée à l'indication des erreurs.

Remarques d'ordre général

Si vous ne spécifiez ni savepoint_name ni transaction_name dans l'instruction ROLLBACK TRANSACTION, l'annulation sera effectuée à partir du début de la 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. Dans les deux cas, ROLLBACK TRANSACTION ramène à 0 la fonction système @@TRANCOUNT. ROLLBACK TRANSACTION savepoint_name ne décrémente pas @@TRANCOUNT.

ROLLBACK TRANSACTION ne peut pas faire référence à un attribut savepoint_name dans les transactions distribuées qui sont lancées soit explicitement avec BEGIN DISTRIBUTED TRANSACTION, soit découlant d'une transaction locale.

Une transaction ne peut pas être annulée après l'exécution d'une instruction COMMIT TRANSACTION.

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.

Interopérabilité

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. Une instruction ROLLBACK TRANSACTION dans une procédure stockée qui modifie la 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. Ce message n'affecte pas la suite du traitement.

L'exécution d'une instruction ROLLBACK TRANSACTION dans un déclencheur a les conséquences suivantes :

  • 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 ;

  • le déclencheur termine l'exécution des instructions qui suivent l'instruction ROLLBACK. Si l'une de ces instructions modifie les données, les modifications ne sont pas annulées. Aucun déclencheur imbriqué ne peut être activé par l'exécution de ces instructions ;

  • aucune instruction du traitement suivant celle qui a activé le déclencheur n'est exécutée.

@@TRANCOUNT est incrémenté de un lorsqu'un déclencheur est entré, même en mode de validation automatique. (Le système traite un déclencheur comme une transaction imbriquée implicite).

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. 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.

Les effets d'une instruction ROLLBACK sur les curseurs sont définis par les trois règles suivantes :

  1. avec CURSOR_CLOSE_ON_COMMIT à ON, ROLLBACK ferme tous les curseurs ouverts, sans les désallouer ;

  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. Quel que soit leur type, les curseurs ouverts sont fermés mais pas désalloués ;

  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. Tous les curseurs sont désalloués, quel que soit leur type ou le paramétrage de 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. Les curseurs déclarés dans un traitement précédant le traitement erroné sont soumis aux règles 1 et 2. Un blocage est un exemple de ce type d'erreur. Une instruction ROLLBACK exécutée dans un déclencheur génère aussi automatiquement ce type d'erreur.

Comportement de verrouillage

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. Ces verrous ne sont pas libérés et ne sont pas reconvertis dans leur ancien mode de verrouillage.

Autorisations

Nécessite l'appartenance au rôle public.

Exemples

L'exemple suivant montre l'effet de la restauration d'une transaction nommée.

USE tempdb;
GO
CREATE TABLE ValueTable ([value] int;)
GO

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

--The following statements start a named transaction,
--insert two rows, and then roll back
--the transaction named in the variable @TransactionName.
--Another statement outside of the named transaction inserts two rows.
--The query returns the results of the previous statements.

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;

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

Voir aussi

Référence

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT TRANSACTION (Transact-SQL)

COMMIT WORK (Transact-SQL)

ROLLBACK WORK (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)