Pessoal.
Uso java bean e 2 dao’s fazendo crud, com PrepareStatement/ResultSet, etc. Não uso hibernate.
Tenho uma superclasse Acesso.java com seu DAO, e sua subclasse AcessoWeb.java com seu dao tb.
Preciso inserir um registro simultaneamente em duas tabelas TabAcesso e TabAcessoWeb.
Ao realizar o crud no dao da subclasse eu consigo fazer este insert simultâneo, chamando o método da superclasse.
O problema é que não consigo fazer um controle transacional ao desabilitar o autocommit no dao da superclasse.
Na verdade, não sei como fazer, onde desabilitar o autocommit, aonde usar o conecta.commit e connecta.rollback.
OBS.: Os dois DAO’s estão no mesmo package do projeto.
Talvez pela minha inexperiência, eu esteja no caminho errado.
Alguém pode me mostrar um caminho?
Transações usando DAO's
8 Respostas
Você tem que ver se no seu banco de dados é possivel desabilitar o autocommit.
Na verdade eu não manjo muito de bd… mas ja ouvi algo assim. Vale a pena pesquisar.
da pra usar Spring ?
Exemplo basico, somente como ilustração:
Na classe que usa os DAOs pegue a conexao:
Connection con = // peguei de algum lugar a conexão
con.setAutoCommit(false);
try {
//faco o que é preciso
// aqui com os DAOs
// sen nao deu erro:
con.commit();
} catch(Exception e) {
// deu erro
con.rollback();
}
Lembre-se, esse é o conceito basico.
Em nivel de aprendizado serve p/vc ver como funciona.
[]´s
Dá pra usar o Spring sim! claro. Você tem um modelo simples de como usa-lo? Como implementar o spring?
Quanto ao exemplo acima, entendi, porém o contexto do meu projeto é o seguinte:
Preciso comitar o insert de meu DAO1.java dentro do DAO2.java, ou seja, eu chamo o método insere do DAO1 dentro do insere do DAO2.java, e precisaria comitar neste momento os 2 inserts, dos dois métodos.
Como o autocommit do DAO1 está false, ele não realiza o insert e o DAO2 ao tentar inserir não acha a chave estrangeira que deveria ser gerada pelo DAO1. Aí está o problema.
Dá pra usar o Spring sim! claro. Você tem um modelo simples de como usa-lo? Como implementar o spring?
Quanto ao exemplo acima, entendi, porém o contexto do meu projeto é o seguinte:
Preciso comitar o insert de meu DAO1.java dentro do DAO2.java, ou seja, eu chamo o método insere do DAO1 dentro do insere do DAO2.java, e precisaria comitar neste momento os 2 inserts, dos dois métodos.
Como o autocommit do DAO1 está false, ele não realiza o insert e o DAO2 ao tentar inserir não acha a chave estrangeira que deveria ser gerada pelo DAO1. Aí está o problema.
controlar transação dentro do DAO não é uma boa pratica…
mas p/ resolver o problema é so vc usar a mesma conexão nos dois DAOs… mas nao é a melhor solução.
[]´s
cara spring…
tudo numa transação só PROPAGATION_REQUIRES_NEW
se der certo tudo ele comita senão da rollback em tudo…
Pessoal, consegui compartilhando conexão.
Mas vou estudar o spring, que parece ser a solução definitiva pro controle transacional.
Alguém conhecem uma documentação legal, para iniciante em spring?
Ah, obrigado a todos pelo auxílio.
cara spring…tudo numa transação só PROPAGATION_REQUIRES_NEW
se der certo tudo ele comita senão da rollback em tudo…
Cara,
com certeza Spring p/ controle de transações seria bem melhor, Isolando transação por camada e/ou por metodo.
So que se o cara ta cm dificultade de entender o conceito da transação atomica usando JDBC, falar em spring so vai complicar mais.
Como eu falei p/ ele, da p/ usar da maneira como escrevi, mas de maneira didatica, p/ entendimento do conceito.
Depios disso, ele pode partir p/ outro tipo de controle, via container, spring, AOP ou qualquer outra coisa.
Não adianta o cara querer correr antes de aprender a caminhar.
[]´s