Partage via


TRANSACTION DE RETOUR EN ARRIÈRE (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Entrepôt dans Microsoft FabricBase de données SQL 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 utilisez ROLLBACK TRANSACTION pour effacer toutes les modifications de données apportées au début de la transaction ou à partir d’un point d’enregistrement. ROLLBACK TRANSACTION libère également les ressources détenues par la transaction.

Les modifications apportées aux variables locales ou aux variables de table ne sont pas effacées par cette instruction.

Conventions de la syntaxe Transact-SQL

Syntax

Syntaxe pour SQL Server, Azure SQL Database, Azure SQL Managed Instance, base de données SQL dans Microsoft Fabric.

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

Syntaxe pour Fabric Data Warehouse, Azure Synapse Analytics et Parallel Data Warehouse Database.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric.

Nom attribué à la transaction avec 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. Lorsqu’il existe des transactions internes, transaction_name doit être le nom de l’instruction la plus BEGIN TRANSACTION externe. transaction_name respecte toujours la casse, même si l’instance du moteur de base de données n’est pas sensible à la casse.

@tran_name_variable

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric.

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 lorsqu’une restauration doit affecter uniquement la partie de la transaction après le point d’enregistrement.

@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 RAISERROR les PRINT instructions.

Remarks

ROLLBACK TRANSACTION sans savepoint_name ou transaction_name rétablit le début de la transaction. Lorsqu’il existe des transactions internes, cette même instruction annule 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 promues à 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 interne contenue dans la transaction en cours de restauration. Dans cette instance, la transaction interne est restaurée, même si vous l’avez émise COMMIT TRANSACTION .

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 .

Note

Le moteur de base de données ne prend pas en charge les transactions imbriquées gérables indépendamment. Une validation d’une transaction interne décrémente @@TRANCOUNT mais n’a aucun autre effet. Une restauration d’une transaction interne restaure toujours la transaction externe, sauf si un point d’enregistrement existe et est spécifié dans l’instruction ROLLBACK .

Interoperability

Dans les procédures stockées, une ROLLBACK TRANSACTION instruction sans savepoint_name ou transaction_name annule toutes les instructions à l’extérieur.BEGIN TRANSACTION Une ROLLBACK TRANSACTION instruction dans une procédure stockée qui provoque @@TRANCOUNT une valeur différente à l’achèvement de la procédure que la valeur au début de la procédure produit 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 interne implicite.

Une ROLLBACK TRANSACTION instruction dans une procédure stockée n’affecte pas les instructions suivantes dans le lot qui a appelé la procédure. Les instructions suivantes dans le lot sont exécutées.

Une ROLLBACK TRANSACTION instruction dans un déclencheur met fin au 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 les règles suivantes :

  • Avec CURSOR_CLOSE_ON_COMMIT la valeur définie ONsur , ROLLBACK ferme mais ne désalloue pas tous les curseurs ouverts.

  • Avec CURSOR_CLOSE_ON_COMMIT la valeur définie OFFsur , ROLLBACK n’affecte pas les curseurs synchrones STATICINSENSITIVE ou asynchrones ouverts ou qui STATIC sont entièrement remplis. Quel que soit leur type, les curseurs ouverts sont fermés mais pas désalloués ;

  • Erreur qui met fin à un lot et annule la transaction désalloue tous les curseurs déclarés dans le lot contenant l’instruction produisant l’erreur. 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 lot produisant l’erreur. Les curseurs déclarés dans un lot avant que le lot produisant l’erreur soit soumis aux deux règles précédentes.

    Un interblocage est un exemple de ce type d’erreur. Une ROLLBACK instruction émise dans un déclencheur entraîne également ce comportement.

Comportement de 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 verrous réaffectés et convertis. Ces verrous ne sont pas libérés et ne sont pas convertis en mode de verrouillage précédent.

Permissions

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

Examples

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

Voici le jeu de résultats.

value
-----
3
4