Temos operações DML em cada etapa de um trabalho do SQL Server. Para garantir que a atualização/inserção seja revertida caso algo dê errado, envolvi as modificações de dados de cada etapaTRY CATCH
e TRANSACTION
bloqueei:
BEGIN TRY
BEGIN TRANSACTION
[[INSERT/update statements]] ...
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRANSACTION
PRINT 'Successful.'
END
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
BEGIN
ROLLBACK TRANSACTION
PRINT 'Unsuccessful.'
END
END CATCH
Ele garante que as manipulações de dados serão revertidas em caso de erro(s)? Ou outras considerações devem ser levadas em conta?
Haveria alguma maneira melhor de fazer isso (usando configurações, etc)?
Obrigada.
Prefiro recomendar um padrão como o de Exception Handling and Nested Transactions :
Este padrão verifica o
XACT_STATE()
bloco catch para proteger contra transações não confirmáveis :Seu código está verificando
@@TRANCOUNT
em lugares onde não pode ser 0, ele usa uma mistura de mensagens informativas PRINT e conjuntos de resultados SELECT para comunicar o sucesso, ele não manipula erros que são recuperáveis. Idealmente, as exceções devem ser propagadas para o cliente, neste caso, para o trabalho do Agente (ou seja, sua captura deve aumentar novamente).O que você tem parece bom para mim. Eu sugeriria fazer algo com as informações, é claro, depois de reverter a transação, por exemplo, gravá-la em um log.