Várias transações no mesmo Connection (Firebird JDBC)

8 respostas
raci0nal

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”.

8 Respostas

raphael_adrien

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.

raci0nal

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’’

rodrigo_corinthians

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…

raci0nal

É, 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’’

rodrigo_corinthians

Então mas usando o Hibernate vc poderá continuar usando o seu amado Sql normalmente, lógico que muitaaaa coisa o Hibernate já deixa pronto pra vc…

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/classic/Session.html#createSQLQuery(java.lang.String,%20java.lang.String[],%20java.lang.Class[])

raci0nal

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’’

Y

[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. :?

raci0nal

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.

Criado 6 de setembro de 2007
Ultima resposta 11 de set. de 2007
Respostas 8
Participantes 4