it-swarm.com.de

Richtige Verwendung von Transaktionen in SQL Server

Ich habe 2 Befehle und brauche beide richtig ausgeführt oder keiner von ihnen ausgeführt. Ich glaube, ich brauche eine Transaktion, weiß aber nicht, wie ich sie richtig verwenden soll.

Was ist das Problem mit dem folgenden Skript?

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

Der Befehl INSERT wird ausgeführt, aber der Befehl UPDATE hat ein Problem.

Wie kann ich dies implementieren, um beide Befehle zurückzusetzen, wenn einer von ihnen einen Ausführungsfehler aufweist?

202
Saeid

Fügen Sie einen Try/Catch-Block hinzu. Wenn die Transaktion erfolgreich ist, werden die Änderungen festgeschrieben. Wenn die Transaktion fehlschlägt, wird die Transaktion zurückgesetzt:

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  
456
Darren

Zu Beginn der gespeicherten Prozedur sollte SET XACT_ABORT ON gesetzt werden, um Sql Server anzuweisen, die Transaktion im Fehlerfall automatisch zurückzusetzen. Wenn ausgelassen oder auf OFF gesetzt, muss nach jeder Anweisung @@ ERROR getestet werden oder TRY ... CATCH rollback verwendet werden.

108

Einfacher Ansatz:

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