Öppna bara en transaktion när du är inne i TRY
blockera och strax före själva uttalandet, och begå det direkt. Vänta inte på att din kontroll går till slutet av partiet för att utföra dina transaktioner.
Om något går fel medan du är i TRY
blockera och du har öppnat en transaktion, kommer kontrollen att hoppa till CATCH
blockera. Återställ helt enkelt din transaktion där och gör annan felhantering vid behov.
Jag har lagt till en liten check för alla öppna transaktioner med @@TRANCOUNT
funktion innan transaktionen faktiskt återställs. Det är inte riktigt vettigt i det här scenariot. Det är mer användbart när du gör några valideringskontroller i din TRY
blockera innan du öppnar en transaktion som att kontrollera param-värden och andra saker och höja felet i TRY
blockera om någon av valideringskontrollerna misslyckas. I så fall kommer kontrollen att hoppa till CATCH
blockera utan att ens öppna en transaktion. Där kan du kontrollera eventuella öppna transaktioner och återställa om det finns några öppna. I ditt fall behöver du verkligen inte leta efter någon öppen transaktion eftersom du inte kommer att ange CATCH
blockera om inte något går fel i din transaktion.
Fråga inte efter att du har utfört DELETE
drift oavsett om den behöver begås eller rullas tillbaka; gör alla dessa validering innan du öppnar transaktionen. När en transaktion har öppnats, utför den omedelbart och vid eventuella fel, gör felhantering (du gör ett bra jobb genom att få detaljerad information genom att använda nästan alla felfunktioner).
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