Caros bom dia.
Gostaria de saber se é possivel com o Vraptor e Hibernate ter o controle de transações (financeiras),
saque e depósito em conta corrente.
Preciso realizar um saque e um depósito, duas transações independentes e gostaria de saber se é
possivel realizar rollback se a segunda transação não acontecer.
Li o Artigo sobre a Classe HibernateHelper (aqui no Guj), pois procuro algo que possa proteger as duas
transações, mas gostaria se o Vraptor tem algo semelhante.
Muito obrigado
VRaptor - ou qualquer outro framework web - nao eh responsavel por gerenciamento de transacoes. Usando hibernate, simplesmente chame session.beginTransaction(), e depois session.getTransaction().commit() / .rollback() no caso de erro.
Voce deve realizar ambas operacoes sob o mesmo contexto transacional.
Rafael
Caro Rafael, muito obrigado.
Para fazer testes fiz algo parecido com isso :
gostaria de saber se é dessa forma que voce falou.
try{
this.daoFactory.beginTransaction();
this.daoFactory.getCartao_smDao().adicionaCartaoAluno(cartao_sm, aluno_sm);
aluno_sm=null; // coloquei null aqui para que a segunda "transação" desse problema
this.daoFactory.getAluno_smDao().atualiza(aluno_sm);
this.daoFactory.commit();
}catch (Exception e){
System.out.println("Transação não efetuada");
e.printStackTrace();
return false;
}
return true;
Dessa forma as duas “transações” se tornarão uma só ?
Ou as duas transações estão sobre o mesmo controle de transação?
Faltou o rollback no catch da exception.
As duas operacoes irao executar sob a mesma transacao, sim. Se uma falhar, a outra nao sera finalizada tambem.
Rafael
Muito obrigado, esclareceu minhas dúvidas
quanto a segurança deste tipo de transação.
Coloquei o Rollback(). E funcionou perfeito.
Valeu
[quote=roger2007]Caro Rafael, muito obrigado.
Para fazer testes fiz algo parecido com isso :
gostaria de saber se é dessa forma que voce falou.
try{
this.daoFactory.beginTransaction();
this.daoFactory.getCartao_smDao().adicionaCartaoAluno(cartao_sm, aluno_sm);
aluno_sm=null; // coloquei null aqui para que a segunda "transação" desse problema
this.daoFactory.getAluno_smDao().atualiza(aluno_sm);
this.daoFactory.commit();
}catch (Exception e){
System.out.println("Transação não efetuada");
e.printStackTrace();
return false;
}
return true;
Dessa forma as duas “transações” se tornarão uma só ?
Ou as duas transações estão sobre o mesmo controle de transação?
[/quote]
Só um detalhezinho, mas na minha opinião, o ideal seria lançar uma RuntimeException no catch (após o rollback) over um System.out.println.
Rob