Otwieraj transakcję tylko wtedy, gdy znajdziesz się w TRY
bloku i tuż przed właściwą instrukcją i natychmiast ją zatwierdź. Nie czekaj, aż kontrola przejdzie do końca partii, aby zatwierdzić transakcje.
Jeśli coś pójdzie nie tak podczas TRY
bloku i otworzyłeś transakcję, kontrolka przeskoczy do CATCH
blok. Po prostu wycofaj transakcję tam i wykonaj inną obsługę błędów zgodnie z wymaganiami.
Dodałem mały czek dla każdej otwartej transakcji za pomocą @@TRANCOUNT
funkcji przed faktycznym wycofaniem transakcji. To naprawdę nie ma sensu w tym scenariuszu. Jest to bardziej przydatne, gdy wykonujesz kilka walidacji w swoim TRY
blok przed otwarciem transakcji, jak sprawdzanie wartości parametrów i innych rzeczy oraz zgłaszanie błędów w TRY
blokować, jeśli którykolwiek z testów walidacji zakończy się niepowodzeniem. W takim przypadku kontrolka przeskoczy do CATCH
blokować nawet bez otwierania transakcji. Tam możesz sprawdzić, czy są otwarte transakcje i wycofać, jeśli są jakieś otwarte. W twoim przypadku naprawdę nie musisz sprawdzać żadnej otwartej transakcji, ponieważ nie wprowadzisz CATCH
blokować, chyba że coś pójdzie nie tak w transakcji.
Nie pytaj po wykonaniu DELETE
operacja, czy ma zostać zatwierdzona, czy wycofana; wykonaj wszystkie te walidacje przed otwarciem transakcji. Po otwarciu transakcji zatwierdź ją od razu, a w przypadku jakichkolwiek błędów wykonaj obsługę błędów (dobrze wykonujesz pracę, uzyskując szczegółowe informacje za pomocą prawie wszystkich funkcji błędów).
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