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