Olá,
Tenho uma aplicação onde vou utilizar uma mesma conexão ao banco (Connection) para executar vários comandos.
Gostaria de saber como fazer um controle transacional entre a execução destes comandos (PreparedStatement).
Por exemplo:
Minha conexão:
Connection con = getConexao();
con.setAutoCommit(false);
Comando 1:
PreparedStatement ps1 = con.prepareStatement("insert qualquer");
ps1.executeUpdate();
ps1.close();
Comando 2:
PreparedStatement ps2 = con.prepareStatement(" outro insert qualquer");
ps2.executeUpdate();
ps2.close();
Como eu dou um “commit” no “Comando 1” e um “rollback” no “Comando 2”?
OBS: não pode ser entre os comandos, mas só depois que os dois forem executados
O jeito que eu achei que fosse possível, era com os “Savepoints”… mas só o comando “rollback()” da “Connection” possui o parâmetro “Savepoint”.
Cara você pode utilizar um facade para fazer esse controle transacional para você, ai você poderá executar n comandos, alterar a classe de negocio tranquilamente.
Bons Códigos.
Não saquei como eu faria isso com Facade…
Poderia me indicar mais ou menos como ficaria?
Algum exemplo?
Abraços e obrigado pela atenção!
Marcos A. C. Jordão’’
Cria uma classe que recebe um Connection como parâmetro e implementa 3 métodos(commit, rollback e close) daí vc faz todo o controle dentro deles ou melhor usa o controle de transação do Spring, JOTM, JTA existem n opções melhores do que trabalhar diretamente com Jdbc…
É, realmente estou pensando em abandonar a JDBC mesmo.
Estive testando o Hibernate e me pareceu muito bom, inclusive o lance das transações funcionou perfeitamente.
Deu um pouco de trabalho para configurar, mas funcionou… e principalmente os meus DAOs ficariam muito mais simples.
Só fico meio com medo de abandonar a SQL que eu amo tanto…
Obrigado pelas informações.
Marcos A. C. Jordão’’
Realmente o Hibernate me pareceu bastante interessante e versátil.
A princípio me dei um pouco mal com a configuração, resolvi sair fazendo e só dei cabeçada.
Depois parei, procurei e li alguma documentação (esta aqui foi muito boa)
e consegui configurá-lo sem problemas, funcionando perfeitamente com o Firebird.
Agora vou portar o projeto para ele (só precisarei alterar os DAOs graças à programação em camadas) e me aprofundar mais no uso do Hibernate.
Marcos A. C. Jordão’’
[dummy-comment]
Acho que o mais correto é você usar Savepoint’s.
Você executa o primeiro comando. Cria um Savepoint para a conexão. Aí então executa o segundo comando.
Se tudo der certo como tem que ser, simplesmente dê um commit e comita tudo. Senão, faça um rollback para o Savepoint e dá um commit, comitando apenas o primeiro comando.
Acho que vai dar bem menos trabalho do que utilizar Hibernate. ^^
http://java.sun.com/javase/6/docs/api/java/sql/Connection.html#setSavepoint(java.lang.String)
O poder está na API.
[/dummy-comment]
Não havia lido o último parágrafo do primeiro post. :?
Justamente…
Talvez se eu eu fizesse o caminho “inverso” daria certo.
Tipo, dando “rollback()” nos SavePoints que eu não quero e no final um “commit()”.
Não testei, então não sei afirmar se isso “comitaria” só o que não foi “rollbackeado”… contudo, no meu ponto de vista é uma solução inviável.
Como já tinha vontade de utilizar o Hibernate, vou tentar… pelo que vi não dá tanto trabalho assim, pelo contrário facilita em muito quando analisado à longo prazo.