Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

TSQL Try / Catch inside Transaction o viceversa?

Apri una transazione solo quando sei all'interno del TRY block e subito prima dell'istruzione vera e propria e commetterla immediatamente. Non aspettare che il tuo controllo arrivi alla fine del batch per confermare le tue transazioni.

Se qualcosa va storto mentre sei in TRY blocco e hai aperto una transazione, il controllo passerà al CATCH bloccare. È sufficiente eseguire il rollback della transazione e eseguire altre operazioni di gestione degli errori secondo necessità.

Ho aggiunto un piccolo assegno per qualsiasi transazione aperta utilizzando @@TRANCOUNT funzione prima di annullare effettivamente la transazione. Non ha molto senso in questo scenario. È più utile quando esegui alcuni controlli di convalida nel tuo TRY bloccare prima di aprire una transazione come controllare i valori dei parametri e altre cose e generare un errore nel TRY bloccare se uno dei controlli di convalida fallisce. In tal caso, il controllo passerà a CATCH bloccare senza nemmeno aprire una transazione. Lì puoi controllare qualsiasi transazione aperta e rollback se ce ne sono di aperte. Nel tuo caso, non hai davvero bisogno di controllare nessuna transazione aperta in quanto non inserirai il CATCH bloccare a meno che qualcosa non vada storto all'interno della transazione.

Non chiedere dopo aver eseguito DELETE operazione se è necessario eseguire il commit o il rollback; fai tutte queste convalide prima di aprire la transazione. Una volta aperta una transazione, eseguila immediatamente e, in caso di errori, gestisci gli errori (stai facendo un buon lavoro ottenendo informazioni dettagliate utilizzando quasi tutte le funzioni di errore).

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