Sono uno sviluppatore C# che apprende più TSQL. Ho scritto uno script come questo:Una transazione richiede un tentativo di cattura?
begin transaction
--Insert into several tables
end transaction
Ma mi è stato detto che non era una buona idea e usare qualcosa di simile:
BEGIN TRANSACTION;
BEGIN TRY
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
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;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
non vedo il motivo per cui il secondo esempio è più corretto . Il primo non funzionerebbe allo stesso modo? Sembra che il primo aggiornerebbe tutti i tavoli o non lo farà affatto? Non vedo perché controllare lo @@TRANCOUNT
sia necessario prima del commit.
Vorrei fare lo stesso argomento che tu sei. Inoltre il pattern try/catch raccomandato è un anti-pattern che chiamo try/squelch. Cattura ed errore e quindi procede silenziosamente. Questo NON è gestire gli errori, li sta sopprimendo. Detto questo, un blocco try/catch non è richiesto per una transazione. Soprattutto se si è in un trigger, l'utilizzo di un try/catch probabilmente causerà molti più problemi di quanti ne risolverà mai. –
Se qualcosa nel secondo esempio, il commit dovrebbe essere nel blocco try, non dopo il catch ... penso – Kritner