J'ai 2 commandes et j'ai besoin que les deux soient exécutées correctement ou qu'aucune ne soit exécutée. Je pense donc que j'ai besoin d'une transaction, mais je ne sais pas comment l'utiliser correctement.
Quel est le problème avec le script suivant?
BEGIN TRANSACTION [Tran1]
INSERT INTO [Test].[dbo].[T1]
([Title], [AVG])
VALUES ('Tidd130', 130), ('Tidd230', 230)
UPDATE [Test].[dbo].[T1]
SET [Title] = N'az2' ,[AVG] = 1
WHERE [dbo].[T1].[Title] = N'az'
COMMIT TRANSACTION [Tran1]
GO
La INSERT
commande est exécutée, mais la UPDATE
commande a un problème.
Comment puis-je implémenter cela pour restaurer les deux commandes si l'une d'entre elles a une erreur d'exécution?
BEGIN TRANSACTION [Tran1]
être placé à l'intérieurTRY
? Quoi qu'il en soit - morceau de code très simple et élégant.Au début de la procédure stockée, il faut mettre SET XACT_ABORT ON pour demander au serveur SQL de restaurer automatiquement la transaction en cas d'erreur. Si omis ou réglé sur OFF, il faut tester @@ ERROR après chaque instruction ou utiliser le bloc de restauration TRY ... CATCH .
la source
XACT_ABORT
Approche facile:
la source