none
Boa prática para programação de procedures com controle de tranzações RRS feed

  • 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


    segunda-feira, 31 de agosto de 2015 17:47

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.

    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]

    segunda-feira, 31 de agosto de 2015 18:50
  • 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


    segunda-feira, 31 de agosto de 2015 19:34
  • 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]

    terça-feira, 1 de setembro de 2015 15:04
  • 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.

    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"

    terça-feira, 1 de setembro de 2015 21:07
    Moderador