Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

TSQL Try / Catch innerhalb der Transaktion oder umgekehrt?

Ö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