ROLLBACK TRANSACTION (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Entrepôt dans Microsoft Fabric

Cette instruction restaure une transaction explicite ou implicite au début de la transaction, ou à un point d’enregistrement à l’intérieur de la transaction. Vous pouvez utiliser ROLLBACK TRANSACTION pour effacer toutes les modifications apportées aux données effectuées à partir du début de la transaction ou vers un point d’enregistrement. Elle libère également les ressources bloquées par la transaction.

La restauration d’une transaction n’inclut pas les modifications apportées aux variables locales ou aux variables de table. Ces modifications ne sont pas effacées par cette instruction.

Conventions de la syntaxe Transact-SQL

Syntaxe

Syntaxe pour SQL Server et Azure SQL Database.

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

Syntaxe de Synapse Data Warehouse dans Microsoft Fabric, Azure Synapse Analytics et Parallel Data Warehouse Database.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

transaction_name

Nom attribué à la transaction le 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. Lorsque vous imbriquez des transactions, transaction_name devez être le nom de l’instruction la plus BEGIN TRANSACTION externe. transaction_name respecte toujours la casse, même si l’instance de SQL Server n’est pas sensible à la casse.

@tran_name_variable

Nom d’une variable définie par l’utilisateur 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 d’une SAVE TRANSACTION instruction. savepoint_name doit suivre les règles applicables aux identificateurs. Utilisez savepoint_name quand une restauration conditionnelle ne doit affecter qu’une partie de la transaction.

@savepoint_variable

Nom d’une variable définie par l’utilisateur contenant un nom de point de sauvegarde valide. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar.

Gestion des erreurs

Une ROLLBACK TRANSACTION instruction ne produit aucun message à l’utilisateur. Si des avertissements sont nécessaires dans les procédures stockées ou les déclencheurs, utilisez les instructions ou PRINT les RAISERROR instructions. RAISERROR est l’instruction préférée pour indiquer les erreurs.

Notes

ROLLBACK TRANSACTIONsans savepoint_name ou transaction_name rétablit le début de la transaction. Lorsque vous imbriquez des transactions, cette même instruction restaure toutes les transactions internes à l’instruction la plus BEGIN TRANSACTION externe. Dans les deux cas, ROLLBACK TRANSACTION décrémente la @@TRANCOUNT fonction système sur 0. ROLLBACK TRANSACTION <savepoint_name> ne décrémente @@TRANCOUNTpas .

ROLLBACK TRANSACTION ne peut pas référencer une savepoint_name dans les transactions distribuées démarrées explicitement avec BEGIN DISTRIBUTED TRANSACTION ou réaffectées à partir d’une transaction locale.

Une transaction ne peut pas être restaurée après l’exécution d’une COMMIT TRANSACTION instruction, sauf si elle COMMIT TRANSACTION est associée à une transaction imbriquée contenue dans la transaction restaurée. Dans cette instance, la transaction imbriquée est restaurée, même si vous avez émis une COMMIT TRANSACTION transaction pour celle-ci.

Dans une transaction, les noms de points de sauvegarde en double sont autorisés, mais l’utilisation ROLLBACK TRANSACTION du nom de point de sauvegarde dupliqué n’est rétablie qu’à l’aide de ce nom de point d’enregistrement le plus récent SAVE TRANSACTION .

Interopérabilité

Dans les procédures stockées, ROLLBACK TRANSACTION les instructions sans savepoint_name ou transaction_name restaurer toutes les instructions à l’extrémité externe BEGIN TRANSACTION. Instruction ROLLBACK TRANSACTION dans une procédure stockée qui provoque @@TRANCOUNT une valeur différente lorsque la procédure stockée se termine par rapport à la @@TRANCOUNT valeur lorsque la procédure stockée a été appelée génère un message d’information. Ce message n’affecte pas le traitement ultérieur.

Si un ROLLBACK TRANSACTION déclencheur est émis :

  • 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 continue d’exécuter les instructions restantes après l’instruction ROLLBACK . Si l'une de ces instructions modifie les données, les modifications ne sont pas restaurés. Aucun déclencheur imbriqué ne peut être activé par l'exécution de ces instructions ;

  • Les instructions du lot après l’instruction qui a déclenché le déclencheur ne sont pas exécutées.

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

ROLLBACK TRANSACTION les instructions dans les procédures stockées n’affectent pas les instructions suivantes dans le lot qui a appelé la procédure ; les instructions suivantes dans le lot sont exécutées. ROLLBACK TRANSACTION les instructions dans les déclencheurs terminent le lot contenant l’instruction qui a déclenché le déclencheur ; les instructions suivantes dans le lot ne sont pas exécutées.

L’effet d’un ROLLBACK curseur est défini par ces trois règles :

  • Avec CURSOR_CLOSE_ON_COMMIT l’ensemble ON, ROLLBACK ferme, mais ne désalloue pas tous les curseurs ouverts.

  • Avec CURSOR_CLOSE_ON_COMMIT l’ensemble OFF, ROLLBACK n’affecte pas les curseurs synchrones INSENSITIVESTATIC ou asynchrones STATIC ouverts qui ont été 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ètre 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 lot avant le lot d’erreurs sont soumis aux deux premières règles. Un blocage est un exemple de ce type d'erreur. Une ROLLBACK instruction émise dans un déclencheur génère également automatiquement ce type d’erreur.

Comportement du verrouillage

Une ROLLBACK TRANSACTION instruction spécifiant une savepoint_name libère tous les verrous acquis au-delà du point d’enregistrement, à l’exception des escalades et des conversions. Ces verrous ne sont pas libérés et ne sont pas convertis en mode de verrouillage précédent.

Autorisations

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

Exemples

L'exemple suivant montre l'effet de la restauration d'une transaction nommée. Après avoir créé une table, les instructions suivantes démarrent une transaction nommée, insèrent deux lignes, puis restaurez la transaction nommée dans la variable @TransactionName. Une autre instruction en dehors de la transaction nommée insère deux lignes. La requête retourne les résultats des instructions précédentes.

USE tempdb;
GO

CREATE TABLE ValueTable ([value] INT);
GO

DECLARE @TransactionName 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;

Voici le jeu de résultats obtenu.

value
-----
3
4