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

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

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[])

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.