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.
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
Paramètre 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 un type de données char, varchar, nchar ou nvarchar.
Notes
ROLLBACK TRANSACTION efface 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.
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. En revanche, ROLLBACK TRANSACTION savepoint_name ne décrémente pas @@TRANCOUNT.
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.
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.
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 d'autovalidation. (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.
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.
Les effets d'une instruction ROLLBACK sur les curseurs sont définis par les trois règles suivantes :
avec CURSOR_CLOSE_ON_COMMIT à ON, ROLLBACK ferme tous les curseurs ouverts, sans les désallouer ;
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 ;
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.
Pour obtenir un exemple de code illustrant ROLLBACK TRANSACTION, consultez Transactions imbriquées.
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';
--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
Voir aussi