Estou com uma duvida que envolve transacoes em java.
Olha só tenho o seguinte modelo.
Servlet Chama negocios
Negocios executa minhas regras de negocio estando td de acordo chama persistence que vai executar uma acao x no db.
Para persistir os dados estou usando hibernate, na minha classe generic DAO estou usando transacao e ta td ok.
A minha duvida é:
Estou com uma duvida que envolve transacoes em java.
Olha só tenho o seguinte modelo.
Servlet Chama negocios
Negocios executa minhas regras de negocio estando td de acordo chama persistence que vai executar uma acao x no db.
Para persistir os dados estou usando hibernate, na minha classe generic DAO estou usando transacao e ta td ok.
A minha duvida é:
Oque quero é garantir que todas estas acoes sejam executadas, só que estou em negocios.
Posso implementar transacao aki?
Acho q ta meio confuso …
Transação realmente tem que ser demarcada em nível de negócio. Se ficar acoplada ao banco, você poderá ter problemas, como o citado. Não garantirás a atomicidade.
Para isso podes fazer de várias maneiras, mas já que está usando Hibernate, aconselho a olhar o Proxy de Transação do Spring. É muito fácil de configurar hoje em dia e possui Annotations, assim você poderá garantir o isolamento de transação da do ponto que demarcou entre outras features.
Fica a dica :-).
sergiotaborda
Silvio_java:
Ola pessoal.
Estou com uma duvida que envolve transacoes em java.
Olha só tenho o seguinte modelo.
Servlet Chama negocios
Negocios executa minhas regras de negocio estando td de acordo chama persistence que vai executar uma acao x no db.
Para persistir os dados estou usando hibernate, na minha classe generic DAO estou usando transacao e ta td ok.
A minha duvida é:
Oque quero é garantir que todas estas acoes sejam executadas, só que estou em negocios.
Posso implementar transacao aki?
Acho q ta meio confuso …
O papel do DAO ( assintomático de sindrome de DAO ou não ) nunca foi, nem será nunca o de controlar transações.
DAO que iniciam transações estão votados ao fracasso.
Transação é um conceito global. Alguem tem que a iniciar e controlar se deu certo. Esse alguem, normalmente é a classe de serviço, que vc chama de negoico.
Vc não vai implementar transação nessa classe, vc vai iniciar a transação. São coisas diferentes. O DAO vai usar a transação ativa no momento que ele for fazer as ações no banco.
Em ambiente JEE vc usa a interface UserTransaction para controlar a transação, ou usa mecanismo de anotação ou configuração para que o ambiente faça isso sozinho facilitando o sue trabalho. No caso de usar o hibernate vc precisa ter acesso à classe Transactino do ppr hibernate. Pode ser diretamente ou encapsulada em outro objeto.
Moral da historia, na sua classe de negocio vc precisa ter um codigo semelhante a este:
Transactiontansaction=...// obtem de alguam forma try{transaction.begin();// codigo de negociotransaction.commit();}catch(Exceptione){transaction.roolback();throwe;}
alf_f2
É recomendável utilizar um recurso mais avançado de transação: EJB ou Spring
Assim vc poderá demarcar as transações:
Inicio - Faz um monte de coisas - Fim
Para que estes mecanismos funcionem sei que é necessário utilizar um driver de BD que seja XA
S
Silvio_java
Valeu gente.
Neste caso vou ter que capturar a minha conexao na minha classe de negocios e no dao buscar esta transacao corrente.
Basicamente seria isto?