ROLLBACK TRANSACTION (Transact-SQL)
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Warehouse dans microsoft Fabric SQL Database dans Microsoft Fabric SQL Database 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 }
[ ; ]
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 TRANSACTION
sans 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 @@TRANCOUNT
pas .
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’ensembleON
,ROLLBACK
ferme, mais ne désalloue pas tous les curseurs ouverts.Avec
CURSOR_CLOSE_ON_COMMIT
l’ensembleOFF
,ROLLBACK
n’affecte pas les curseurs synchronesINSENSITIVE
STATIC
ou asynchronesSTATIC
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. UneROLLBACK
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.
value
-----
3
4