sql >> Databáze >  >> RDS >> Sqlserver

TSQL Try / Catch within Transaction nebo naopak?

Transakci otevřete až poté, co jste uvnitř TRY blok a těsně před skutečným příkazem a ihned jej potvrďte. Nečekejte, až vaše kontrola přejde na konec dávky, abyste potvrdili své transakce.

Pokud se něco pokazí, když jste v TRY blok a otevřeli jste transakci, ovládací prvek skočí na CATCH blok. Jednoduše tam vraťte svou transakci a proveďte další ošetření chyb podle potřeby.

Přidal jsem malou kontrolu jakékoli otevřené transakce pomocí @@TRANCOUNT před skutečným vrácením transakce zpět. V tomto scénáři to opravdu nedává moc smysl. Je užitečnější, když provádíte nějaké kontroly ověření ve vašem TRY zablokovat před otevřením transakce, jako je kontrola hodnot parametrů a dalších věcí a vyvolání chyby v TRY blokovat, pokud některá z ověřovacích kontrol selže. V takovém případě ovládací prvek skočí na CATCH zablokovat bez otevření transakce. Zde můžete zkontrolovat všechny otevřené transakce a vrátit zpět, pokud jsou nějaké otevřené. Ve vašem případě opravdu nemusíte kontrolovat žádnou otevřenou transakci, protože nezadáte CATCH blokovat, pokud se uvnitř vaší transakce něco nepokazí.

Po provedení DELETE se neptejte operace, zda je třeba ji potvrdit nebo vrátit zpět; provést všechna tato ověření před otevřením transakce. Jakmile je transakce otevřena, ihned ji potvrďte a v případě jakýchkoli chyb proveďte ošetření chyb (odvádíte dobrou práci, když získáte podrobné informace pomocí téměř všech chybových funkcí).

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. Jak nastavit databázi WordPress MySQL v cloudu

  2. Jak se připojím k databázi MySQL v Pythonu?

  3. Jak monitorovat PostgreSQL pomocí Nagios

  4. Jak mít dynamické SQL v MySQL uložené procedury