Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

TSQL Try / Catch w ramach transakcji lub odwrotnie?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić zgodność bazy danych SQL Server po przestarzałej funkcji sp_dbcmptlevel?

  2. Pobieranie wartości zwracanej z procedury składowanej w C#

  3. Hierarchiczna lista typów zdarzeń wyzwalających w SQL Server 2019

  4. Ryzyko kolizji UUID przy użyciu różnych algorytmów

  5. Wypróbuj te sprawdzone metody monitorowania bazy danych MySQL