Eu estava lendo os exemplos no MSDN para TRY-CATCH
blocos.
A listagem de código para o exemplo B é a seguinte:
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
O que não entendo é por que eles se preocupariam em verificar @@TRANCOUNT
o CATCH
bloco. É realmente possível que a contagem de transações seja < 1 neste trecho de código ou a cláusula de guarda é apenas um exemplo do princípio de que os exemplos devem ser exemplares ?
É uma prática de programação defensiva apenas fazer uma ação (reversão) se for possível.
A tabela pode ter um
DELETE
gatilho que reverte a transação e lança um erro.