Usuário com melhor resposta
Boa prática para programação de procedures com controle de tranzações

Pergunta
-
Olá a todos,
Trabalhando e estudando procedures que necessitam fazer um controle transacional, algumas questões não ficaram claro pra mim. É sabido que instruções externa de COMMIT/ROLLBACK prevalece sobre os lotes aninhados e que em um lote aninhados ROLLBACK seta @@TRANCOUNT para 0.
Oque não esta claro pra mim é sobre onde invocar o ROLLBACK; na própria procedure ou no lote externo? E se o lote externo não controlar transação e executar uma chamada simples desta procedure que precisa reverte todas as instruções em caso de falha/erro ? E como evitar a mensagem de erro no lote externo quando executar uma procedure que executou um ROLLBACK:
Agradeço a contribuição.
Dionata Pizzatto
- Editado Diônata Pizzatto segunda-feira, 31 de agosto de 2015 17:48
Respostas
-
Junior mais uma vez obrigado,
Talvez eu não tenha deixado claro minha dúvida, sobre a melhor forma de trabalhar com controle de trazações em procedures aninhadas a outras transações que necessitam continuar execultando após um ROOLBACK desta transação aninhada.
Mas de qualquer forma, encontrei a solução em blog. Que resumido: A solução mais adequada para tal é salvar a transação aninhada.
BLOG: http://sqlstudies.com/2014/01/06/transactions-rolling-back-a-transaction-inside-a-stored-procedure
att,
Dionata Pizzatto.
- Marcado como Resposta Diônata Pizzatto terça-feira, 1 de setembro de 2015 20:44
Todas as Respostas
-
Diônata,
Se estamos falando de trasanções sejam elas explícitas ou implíticas, tanto o comando Commit como o Rollback devem e necessitam estar dentro de um bloco transação para que se controle possa ser aplicado, isso vale para uma procedure ou até mesmo um lote de transações que estão sendo processadas externamente, ambos os casos devem estar dentro de Begin Transaction.
Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Junior, obrigado por responder!
Isto está claro para mim! Minha dúvida não é se eu posso ou não executar as intruções COMMIT/ROLLBACK fora de um Begin Transaction.
att,
Dionata Pizzatto
- Editado Diônata Pizzatto segunda-feira, 31 de agosto de 2015 19:36
-
Diônata,
A resposta é simples e direta, não, não pode, estes são comandos específicos que você terá que utilizar sempre em conjunto com o um Begin Transaction.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Junior mais uma vez obrigado,
Talvez eu não tenha deixado claro minha dúvida, sobre a melhor forma de trabalhar com controle de trazações em procedures aninhadas a outras transações que necessitam continuar execultando após um ROOLBACK desta transação aninhada.
Mas de qualquer forma, encontrei a solução em blog. Que resumido: A solução mais adequada para tal é salvar a transação aninhada.
BLOG: http://sqlstudies.com/2014/01/06/transactions-rolling-back-a-transaction-inside-a-stored-procedure
att,
Dionata Pizzatto.
- Marcado como Resposta Diônata Pizzatto terça-feira, 1 de setembro de 2015 20:44
-
Junior, obrigado por responder!
Isto está claro para mim! Minha dúvida não é se eu posso ou não executar as intruções COMMIT/ROLLBACK fora de um Begin Transaction.
att,
Dionata Pizzatto
Dionata,
Não tem sentido executar uma instrução fora de uma transação, mas caso você acredite que possa ter "pendências" com transações abertas eu sugiro que você faça uma pequena verificação utilizando a variável global @@TRANCOUNT.
Segue abaixo um trecho de script T-SQL para você adaptar à sua necessidade:
IF @@TRANCOUNT > 0 BEGIN COMMIT TRAN END
Para maiores informações veja:
https://msdn.microsoft.com/pt-br/library/ms187967(v=SQL.120).aspx
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval Ramos
Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
----------------------------------
Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"