Åbn først en transaktion, når du er inde i TRY
blokere og lige før selve erklæringen, og begå det med det samme. Vent ikke på, at din kontrol går til slutningen af partiet for at udføre dine transaktioner.
Hvis noget går galt, mens du er i TRY
blokere, og du har åbnet en transaktion, vil kontrollen hoppe til CATCH
blok. Du skal blot rulle din transaktion tilbage der og udføre anden fejlhåndtering efter behov.
Jeg har tilføjet en lille check for enhver åben transaktion ved hjælp af @@TRANCOUNT
funktion, før transaktionen rent faktisk rulles tilbage. Det giver ikke rigtig meget mening i dette scenarie. Det er mere nyttigt, når du laver nogle valideringstjek i din TRY
blokere, før du åbner en transaktion som at tjekke param-værdier og andre ting og hæve fejl i TRY
blokere, hvis nogen af valideringskontrollerne mislykkes. I så fald vil kontrollen hoppe til CATCH
blokere uden selv at åbne en transaktion. Der kan du tjekke for enhver åben transaktion og rollback, hvis der er nogen åbne. I dit tilfælde behøver du virkelig ikke at tjekke for nogen åben transaktion, da du ikke indtaster CATCH
blokere, medmindre noget går galt i din transaktion.
Spørg ikke efter du har udført DELETE
drift, uanset om den skal forpligtes eller rulles tilbage; udføre alle disse valideringer, før du åbner transaktionen. Når en transaktion er åbnet, skal du begå den med det samme, og i tilfælde af fejl skal du udføre fejlhåndtering (du gør et godt stykke arbejde ved at få detaljeret information ved at bruge næsten alle fejlfunktionerne).
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