You are on page 1of 9

PLATAFORMA PINHO PARAN

Soluo para Gerenciamento de Transaes no Framework Pinho

Abril 2006

Sumrio de Informaes do Documento

Tipo do Documento: Definio Ttulo do Documento: SoluoCELEPARpara gerenciamentode Transaesno HIBERNATE Estado do Documento: Elaborado Responsveis: Jos AugustoSoaresPrado Palavras-Chaves: Hibernate, transaes, Plataforma Pinho Resumo: Transao um conceito fundamentalde todo sistemade bancode dados Nmero de pginas: 09 Software utilizados: Verso Data Mudanas 1.0 04/2006 Elaborao

SUMRIO
INTRODUO.......................................................................................................................................................4 TRANSAES ANINHADAS...............................................................................................................................4 PROBLEMAS ENCONTRADOS..........................................................................................................................5 MTODOS IMPORTANTES ............................................................................................................................................6 POSSVEIS COMPLICAES J TRATADAS......................................................................................................................7 EXEMPLOS DE UTILIZAO...........................................................................................................................8

INTRODUO
Transao um conceito fundamental de todo sistema de banco de dados. O ponto essencial de uma transao que vrios passos so unidos em um nico processo atmico. Defini-se processo atmico ou bloco de cdigo atomizado como um bloco de cdigo repleto de procedimentos onde exigida a condio: ou todos os procedimentos so concludos com sucesso ou nenhum deve ser realizado de fato. A Plataforma Pinho utiliza o framework HIBERNATE para persistncia de objetos e este usa a linguagem HQL como interface SQL ao desenvolvedor, isto faz com que se programe sempre a mesma consulta HQL independentemente de qual banco de dados utilizado. Alm disso, o HIBERNATE trata de maneira transparente as chaves primrias, estrangeiras e tabelas associativas, abstraindo o acesso aos dados e facilitando uma possvel mudana de fornecedor de banco de dados. Os patterns DAO e FAADE, utilizados pela Plataforma Pinho Paran, foram criados com o intuito de modularizar de maneira organizada as camadas e tarefas dentro do modelo MVC (Model View Controller) em um sistema. Ambos patterns trabalham em conjunto na camada Model, cada qual com suas atribuies. Tendo estes conceitos em mente, trataremos dos pontos relevantes em transaes e da soluo adotada pela Plataforma Pinho para melhorar o controle de transaes na sua arquitetura.

TRANSAES ANINHADAS
Transaes aninhadas so transaes dentro de transaes, ou seja, dentro de um bloco de SQL atomizado encontra-se outro sub-bloco de cdigo SQL que deve ser atomizado tambm, independentemente do bloco pai. Esse recurso provido por alguns bancos de dados porm no suportado pelo HIBERNATE.

PINHO- FRAMEWORK- CELEPAR

5 Por exemplo: BEGIN; UPDATE .... (1) BEGIN; UPDATE .... (2) COMMIT; UPDATE .... (3) ROLLBACK;

Caso o cdigo acima venha a ser passado para um banco de dados sem suporte a transaes aninhadas, a interpretao ser um tanto confusa e errada. Este banco de dados ignorar o segundo BEGIN, pois j existe uma transao aberta. Porm realizar o COMMIT considerando o primeiro BEGIN. Ao encontrar o comando ROLLBACK, a ao desfazer tudo at o ultimo COMMIT, ento ser desfeito apenas o UPDATE ... (3). Essas limitaes impossibilitam o uso de transaes aninhadas no momento.

PROBLEMAS ENCONTRADOS
Ao utilizar como padro a abertura de transaes nas classes do tipo DAO alguns problemas de padronizao eram encontrados. Pelo fato de nem toda transao se resumir a um nico mtodo da classe DAO, a conexo com o banco, ou sesso no caso do HIBERNATE, precisa ser passada de alguma forma para o prximo mtodo que ir continuar a execuo da transao. Apesar da soluo para esse problema ser simples, isso faz com que cada desenvolvedor resolva de uma forma diferente, o que ocasiona falta de padronizao na codificao, dificultando a manuteno do cdigo e principalmente incompatibilidades com a especificao do sistema. Outro problema levantado acontecia quando uma Faade precisava chamar o mtodo de outra Faade, onde ambos precisam controlar transaes. Neste caso transaes aninhadas seriam abertas, o que j vimos que no suportado.
PINHO- FRAMEWORK- CELEPAR

SOLUO
A soluo adotada foi a de no abrir uma sesso (conexo) para cada query que desejamos fazer, e sim fazer com que uma mesma sesso seja usada para um mesmo request, isto , uma mesma Thread. Para tornar isso possvel e concilivel com os padres DAO e FAADE a soluo abrir a transao nas classes do tipo FAADE e utilizar os novos mtodos do Framework Pinho para controle de transaes e sesses. Como foi dito anteriormente quando uma Faade precisar chamar o mtodo de outra Faade poderamos ter um problema pois transaes aninhadas seriam abertas devido ao fato de estar especificado que cada Faade deve ter a sua transao. Para evitar que sejam realmente abertas transaes aninhadas, o Framework Pinho se encarregar de ignorar essa nova abertura de transao.

Mtodos Importantes
Tal controle de transaes no precisar ser preocupao do desenvolvedor desde que este use a chamada das transaes e sesses atravs dos mtodos estticos currentSession e/ou currentTransaction da classe HibernateUtil do Framework Pinho. O mtodo

currentTransaction deve ser chamado nas classes do tipo FAADE, quando necessitarem de controlar transaes, enquanto o mtodo currentSession deve ser chamado em todas as classes do tipo DAO. Estes mtodos abrem transao e sesso, respectivamente, e os associam a Thread da requisio. Para fechar a transao e sesso o desenvolvedor deve utilizar os mtodos HibernateUtil.commitTransaction ou o HibernateUtil.rollbackTransaction. Todas as classes DAO deve chamar o mtodo HibernateUtil.closeSession, este mtodo s fechar realmente a sesso (conexo) se no estiver dentro de uma transao. Seguindo a mesma lgica de abertura, a transao deve ser fechada na FAADE e a sesso fechada na DAO. Isso pode parecer um pouco estranho a primeira vista, mas o fato que utilizando esses mtodos, a sesso no ser de fato fechada caso ainda exista uma

PINHO- FRAMEWORK- CELEPAR

7 transao aberta. Porm importante a utilizao desde padro pois facilitar a manuteno e garantir um melhor reaproveitamento de cdigo. Para entender melhor o uso destes mtodos to importantes verifique os exemplos disponveis neste documento.

A Plataforma Pinho far um controle transacional e ignorar as transaes aninhadas que viro a ser chamadas nesses casos, passando para o HIBERNATE apenas a transao principal, ou seja, a primeira que foi aberta e o ltimo fechamento (seja COMMIT ou ROLLBACK).

Possveis Complicaes j Tratadas

Existem ento, quatro maneiras diferentes de uma transao aninha ser formada: BEGIN BEGIN COMMIT COMMIT BEGIN BEGIN ROLLBACK COMMIT BEGIN BEGIN COMMIT ROLLBACK BEGIN BEGIN ROLLBACK ROLLBACK

Dentre essas quatro maneiras, apenas a segunda maneira apresenta um problema em potencial. Caso acontea um ROLLBACK na transao interna, o componente HibernateUtil do Framework Pinho guardar essa informao e far um ROLLBACK na transao principal, mesmo que ao final seja chamado um COMMIT. importante fazer um bom controle de excees no caso de um ROLLBACK ser acionado dentro de uma transao interna. Uma boa prtica neste caso que o desenvolvedor sempre lance uma exceo logo aps o ROLLBACK, pois caso essa situao ocorra a FAADE, externa que gerou a primeira transao, poder capturar essa exceo e fazer o devido tratamento.

PINHO- FRAMEWORK- CELEPAR

EXEMPLOS DE UTILIZAO
Seguem abaixo, exemplos de mtodos de FAADE e de DAO utilizando o componente HibernateUtil do Framework Pinho para controlar transao e sesso. Exemplo de mtodo da FAADE, iniciando a transao e chamando um mtodo da classe DAO para salvar um aluno.
public String salvarAluno(Aluno aluno) throws ApplicationException, Exception { String retornoNatural = null; DAOFactory hibernateFactory = DAOFactory.getDAOFactory(DAOFactory.HIBERNATE); try { HibernateUtil.currentTransaction(); //Abre sesso e transao AlunoDAO alunoDao = hibernateFactory.getAlunoDAO(); alunoDao.salvarAluno(aluno); retornoNatural = alunoDao.consultaNatural(); HibernateUtil.commitTransaction(); //Fecha sesso e transao } catch (ApplicationException appEx) { HibernateUtil.rollbackTransaction(); throw appEx; } catch (Exception ex) { HibernateUtil.rollbackTransaction(); throw new ApplicationException("mensagem.erro.matricula.servico.salvarAluno", ex, ApplicationException.ICON_ERRO); } return retornoNatural; }

Exemplo de mtodo de busca em uma DAO, tenha em mente que de essencial importncia o tratamento das exceo:
public Aluno buscarAlunoPorPK(Integer codAluno) throws ApplicationException, Exception { Aluno aluno = null; try { Session session = HibernateUtil.currentSession(); aluno = (Aluno) session.load(Aluno.class, codAluno); logAuditoria.info("BUSCA DE ALUNO: Aluno "+ aluno.getNomeAluno() +" consultado por Xxxxxx");

PINHO- FRAMEWORK- CELEPAR

9
} catch (HibernateException he) { throw new ApplicationException("mensagem.erro.matricula.listaDeAlunos", he); } catch (Exception e) { throw e; } finally { HibernateUtil.closeSession(); } return aluno; }

CONCLUSO
Apesar de possveis limitaes da arquitetura, a Plataforma Pinho est desenvolvendo tecnologia para tornar o desenvolvimento de software mais organizado e robusto, conseqentemente agilizando o processo de desenvolvimento. A utilizao dos novos mtodos da classe HibernateUtil facilitar o gerenciamento das transaes HIBERNATE e manter a modularidade proposta com relao a camada de banco de dados.

PINHO- FRAMEWORK- CELEPAR

You might also like