Com o Vraptor é possivel controlar transações financeiras? [RESOLVIDO]

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 :slight_smile:

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