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