Öffnen Sie eine Transaktion nur, wenn Sie sich im TRY
befinden Block und direkt vor der eigentlichen Anweisung und schreiben Sie sie sofort fest. Warten Sie nicht, bis Ihre Kontrolle an das Ende des Stapels geht, um Ihre Transaktionen festzuschreiben.
Wenn etwas schief geht, während Sie sich im TRY
befinden block und Sie haben eine Transaktion geöffnet, springt die Steuerung zum CATCH
Block. Setzen Sie Ihre Transaktion dort einfach zurück und führen Sie nach Bedarf eine andere Fehlerbehandlung durch.
Ich habe eine kleine Überprüfung für jede offene Transaktion mit @@TRANCOUNT
hinzugefügt Funktion, bevor die Transaktion tatsächlich rückgängig gemacht wird. Es macht in diesem Szenario nicht wirklich viel Sinn. Es ist nützlicher, wenn Sie einige Validierungsprüfungen in Ihrem TRY
durchführen blockieren, bevor Sie eine Transaktion öffnen, wie das Überprüfen von Parameterwerten und anderen Dingen und das Auslösen von Fehlern in TRY
blockieren, wenn eine der Validierungsprüfungen fehlschlägt. In diesem Fall springt die Steuerung zum CATCH
blockieren, ohne überhaupt eine Transaktion zu öffnen. Dort können Sie nach offenen Transaktionen suchen und zurücksetzen, wenn es offene gibt. In Ihrem Fall müssen Sie wirklich nicht nach offenen Transaktionen suchen, da Sie den CATCH
nicht eingeben blockieren, es sei denn, bei Ihrer Transaktion geht etwas schief.
Fragen Sie nicht, nachdem Sie DELETE
ausgeführt haben Vorgang, ob er festgeschrieben oder rückgängig gemacht werden muss; Führen Sie alle diese Validierungen durch, bevor Sie die Transaktion öffnen. Sobald eine Transaktion geöffnet ist, übergeben Sie sie sofort und führen Sie im Falle von Fehlern eine Fehlerbehandlung durch (Sie leisten gute Arbeit, indem Sie detaillierte Informationen erhalten, indem Sie fast alle Fehlerfunktionen verwenden).
BEGIN TRY
BEGIN TRANSACTION SCHEDULEDELETE
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
COMMIT TRANSACTION SCHEDULEDELETE
PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRANSACTION SCHEDULEDELETE
PRINT 'Error detected, all changes reversed'
END
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
END CATCH