Correct gebruik van transacties in SQL Server

Ik heb 2 commando’s en ik moet ze allebei correct uitvoeren of geen ervan uitvoeren. Dus ik denk dat ik een transactie nodig heb, maar ik weet niet hoe ik deze correct moet gebruiken.

Wat is het probleem met het volgende script?

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

De opdracht INSERTwordt uitgevoerd, maar de opdracht UPDATEheeft een probleem.

Hoe kan ik dit implementeren om beide commando’s terug te draaien als er een fout optreedt bij de uitvoering?


Antwoord 1, autoriteit 100%

Voeg een try/catch-blokkering toe, als de transactie slaagt, worden de wijzigingen doorgevoerd, als de transactie mislukt, wordt de transactie teruggedraaid:

BEGIN TRANSACTION [Tran1]
  BEGIN TRY
      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]
  END TRY
  BEGIN CATCH
      ROLLBACK TRANSACTION [Tran1]
  END CATCH  

Antwoord 2, autoriteit 22%

Aan het begin van de opgeslagen procedure moet u SET XACT_ABORT ONzetten om SQL Server te instrueren om de transactie automatisch terug te draaien in geval van een fout. Indien weggelaten of ingesteld op UIT, moet men @ testen @ERRORna elke instructie of gebruik PROBEER … CATCH terugdraaienblok.


Antwoord 3, autoriteit 7%

Eenvoudige aanpak:

CREATE TABLE T
(
    C [nvarchar](100) NOT NULL UNIQUE,
);
SET XACT_ABORT ON -- Turns on rollback if T-SQL statement raises a run-time error.
SELECT * FROM T; -- Check before.
BEGIN TRAN
    INSERT INTO T VALUES ('A');
    INSERT INTO T VALUES ('B');
    INSERT INTO T VALUES ('B');
    INSERT INTO T VALUES ('C');
COMMIT TRAN
SELECT * FROM T; -- Check after.
DELETE T;

Other episodes