Ir para o conteúdo

 Voltar a Banco de Tal...
Tela cheia

Escopo de transações

5 de Julho de 2010, 10:30 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 8 vezes

Bom dia, pessoal!

Verificando no código das classes "facade" (PessoaFacade, por exemplo) vi que no final dos métodos que fazem modificação no banco de dados ( incluir(Pessoa pessoa) ), há um bloco de instrução "finally" que encerra a conexão com a base de dados. Isso quer dizer que a transação foi realizada somente para aquele método.

Dessa forma, a questão que me deixa em dúvida é: se em cada método facade, que altera a base, há uma instrução para desconectar do banco de dados. como eu poderia fazer para ter um escopo de transação maior? Por exemplo, imaginando uma hipótese em que eu só possa inserir uma Pessoa caso consiga inserir um Grupo antes também... se eu precisar ativar um método incluir(...), de outro facade (em cascata)..., terei que alterar o código para remover / omitir a linha de desconexão do médodo facade "interno"? Que sugestão podem dar para que eu consiga contornar essa situação?

Espero ter conseguido explicitar bem o meu problema? Caso contrário, tento explicar novamente, com outras palavras...

 Obrigado pela atenção!

Kallás.


Autor: Kallás Kallás


44 comentários

  • 5027e96c2c456119c052b9d4a37310c8?only path=false&size=50&d=404Christian Cleber Masdeval Braz(usuário não autenticado)
    5 de Julho de 2010, 11:27

     

    Já precisei fazer isso também e pelo que entendi funciona mais ou menos assim: cada vez que uma sessão do hibernate (pode-se pensar uma conexão com o banco) é aberta para um determinado banco de dados esta é armazenada na sessão. Se uma facade abre mais de uma conexão distinta, cada uma é armazenada. Se uma facade chama outra que abre uma conexão que já foi aberta, a mesma conexão é retornada (e assim garante a atomicidade da transação).

    Para cada DAO.desconectar que é executado, este verifica se quem esta desconectando é a mesma façade que abriu a conexão e só desconecta se este for o caso. Assim, não importa quantas chamadas de facades ocorram para a mesma conexão, esta só será fechada pela primeira facade que iniciou a transação.

    Um ponto importante é que o código DAO.desconectar sempre deve estar dentro de uma façade. Ou seja, não pode estar dentro do próproio DAO e nem dentro de uma classe que não contenha a string "Facade" no final do seu nome.

    O nosso amigo Luciano Dias ficou de postar alguma coisa explicando melhor como funciona essa parte de facade e transações do BT.

    Att Christian

    • 6ec01e2c2c1c822a058ee6b3483baa3c?only path=false&size=50&d=404Kallás Kallás(usuário não autenticado)
      5 de Julho de 2010, 16:48

       

      Olá Christian! Primeiramente, obrigado pela atenção! Sua resposta ajudou bastante a esclarecer minha dúvida...

      Então, a partir da situação imaginada anteriormente, supondo que na classe de "sequencia" eu chame o método da classe "facade" de grupo para uma inclusão... e precise, em seguida,  efetuar algumas operações antes de chamar o "facade" de pessoa para incluí-la, eu teria (se entendi bem a situação) as seguintes alternativas:

      Ativar o método "incluir" da classe grupo e dentro dele efetuar a gravação do grupo, realizar as operações necessárias e, finalmente, incluir a pessoa... fazendo com que, ao sair do método, a atomicidade seja garantida (isso tornaria a classe facade de grupo menos coesa); OU

      Criar uma outra classe "facade", mais geral, para englobar as inclusões de grupo, pessoa e as operações que eu precisaria executar antes de gravar a pessoa.

      Meu raciocínio está correto?...

      Mais uma vez, obrigado pela ajuda!

      Kallás.

      • 5027e96c2c456119c052b9d4a37310c8?only path=false&size=50&d=404Christian Cleber Masdeval Braz(usuário não autenticado)
        5 de Julho de 2010, 19:10

         

        A façade da forma que está no BT deve implementar cada processo elementar de negócio. Assim as classes de facade deveriam estar orientadas talvez mais para possiveis casos de uso (funcionalidades) do que para os nomes das entidades. Se isso que vc está querendo fazer está mais relacionado à grupo, então faça como em 1, se está mais relacionado com pessoa, faça na façade de pessoa, ou então pra deixar mais organizado ainda, crie uma nova façade com o nome do processo de negocio que ela está resolvendo e coloque tudo ali (essa deve ser a forma mais coesa mesmo).

         

        Christian

Essa comunidade não possui posts nesse blog