2012-07-10 19 views
6
USE AdventureWorks; 
GO 
BEGIN TRANSACTION; 
GO 
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 10; 
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 11; 
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 12; 
GO 
COMMIT TRANSACTION; 
GO 

Was passiert, wenn die erste Löschanweisung fehlschlägt? Werden die 2. und 3. Löschanweisung ausgeführt? Das Beispiel hat keine Fehlerbehandlung, wird eine offene Transaktion im Falle einer Ausnahme verlassen oder führt SQL Server die Transaktion automatisch zurück? Offene Transaktion = gesperrte Ressourcen, oder?Ist ROLLBACK TRANSACTION erforderlich?

Ich entscheide, ob ich TRY ... CATCH auf gespeicherte Prozeduren anwenden muss, die Transaktionen verwenden.

Ich bin über set xact_abort on bewusst, möchte aber wissen, was ohne es passiert. Hier

ist, was ich in docs gefunden - Controlling Transaktionen (Database Engine):

Wenn ein Fehler, den erfolgreichen Abschluss einer Transaktion verhindert, SQL Server rollt automatisch die Transaktion zurück und gibt alle von der gehaltenen Ressourcen Transaktion

Allerdings habe ich in anderen Posts gelesen, dass das automatische Rollback nicht ausgelöst wird.

+0

Ja, verwenden Sie versuchen ... fangen. – Ben

Antwort

11

In Ihrem Beispiel ohne die Verwendung von SET XACT_ABORT ON, wird die Transaktion fortsetzen und sich verpflichten, selbst wenn die erste Anweisung fehlschlägt. In dem von Ihnen zitierten Text sind die Schlüsselwörter if an error **prevents** the successful completion of a transaction, und eine fehlgeschlagene DELETE-Anweisung verhindert nicht, dass die Transaktion abgeschlossen wird.

Ein Beispiel für einen Fehler, der zu einem automatischen Rollback führen würde, ist, wenn die Verbindung zur Datenbank mitten in einer Transaktion unterbrochen wurde. Weiter unten in den MSDN article Sie verwiesen sagt:

Wenn eine Laufzeit Anweisung Fehler (wie eine Einschränkungsverletzung) in einer Charge auftritt, ist das Standardverhalten in der Database Engine zurück nur die Aussage zu rollen, dass hat den Fehler erzeugt. Sie können dieses Verhalten mit der Anweisung SET XACT_ABORT ändern. Nachdem SET XACT_ABORT ON ausgeführt wurde, verursacht jeder Laufzeitsatzungsfehler einen automatischen Rollback der aktuellen Transaktion. Kompilierfehler wie Syntaxfehler sind nicht von SET XACT_ABORT betroffen.

Es ist immer eine gute Idee, Fehlerbehandlung zu verwenden, um Fehler und Rollback bei Bedarf zu erfassen.

+0

Also Rollback die fehlgeschlagene erste delete-Anweisung, dann starten Sie die zweite und dann auf die gleiche Weise - die dritte? Und zuletzt wird es zu einer Commit-Anweisung kommen? Das bedeutet, dass der Fehler in einer einzelnen Anweisung die Batch-Ausführung nicht stoppt, richtig? –

+0

Das ist genau richtig. Außerdem habe ich meine Antwort auf (hoffentlich) ein wenig mehr klar gemacht :) –

5

Ich ziehe den Prozess manuell steuern:

BEGIN TRY 
BEGIN TRAN 

    -- do work 

COMMIT 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    RAISERROR (...) 
END CATCH 
GO 
Verwandte Themen