Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Devo usar BEGIN TRAN em procedures?

Olá. Qual é o comportamento da procedure em caso de erro? As alterações são desfeitas quando ocorrem conflitos? Gostaria de saber se é necessário utilizar Begin Tran em procedures que fazem algum tipo de manipulação de dados no banco, isto é, Update, Delete e Insert. Se for necessário, como fazer pra dar um Rollback na transação caso o Insert tenha dado violação de chave primária ou outro tipo de erro?

3 respostas

Olá Bruno!

Sim, é possível dentro de uma procedure que realize manipulação de dados reverter as alterações em caso de algum erro, porém para isso você terá que usar também o TRY...CATCH, para conseguir reverter em caso de erro, assim no bloco TRY, você vai realizar todas as manipulações, caso tenha alguma falha, no bloco CATCH, você pode executar um Rollback das transações. Na própria documentação do SQL Server, ele mostra como tratar extamente essa situação que você está com dúvida, o exemplo é:

Usando TRY...CATCH em uma transação O exemplo a seguir mostra como um bloco TRY...CATCH funciona dentro de uma transação. A instrução dentro do bloco TRY gera um erro de violação de restrição.

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

Para se aprofundar mais você pode olhar na documentação

Espero ter ajudado!

Ok. Obrigado.

solução!

Bruno, você poderia marcar esse tópico como solucionado, assim caso algum colega tenha a mesma dúvida que você, vai conseguir encontrar a solução aqui!