Transação

10 respostas
thiagorani

Existem o conceito de transação em Java? (commit(), rollback(), etc)

Se sim, quais são os comandos?

Por exemplo, para efetuar uma exclusão em cascata?

10 Respostas

Paulo_Silveira

o JTA e o JTS sao apis que andam lado a lado para fazer transacao em qualquer coisa que alguem tenha implementado suporte para tal.

mas do que voce esta falando exatamente? de banco de dados o JDBCzinho ja tem tudo pronto. claro que ele delega ao driver específico, entao nos bancos sem transacao nao vai funcionar.

Daniel_Quirino_Olive

Considerando que seu banco de dados suporta transação, a interface java.sql.Connection para cada banco de dados possui os métodos que você precisa para fazer “commit” e “rollback” de operações. Algo do tipo:

// conn é a instância já criada da sua conexão com o banco de dados
try{
   conn.setAutoCommit(false);
   //faz alguma coisa no banco de dados...
   conn.commit();
catch(SQLException se){
   conn.rollback();
   //faz log da operação
}

Mais informações: http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Connection.html

thiagorani

Daniel é exatamente assim que fiz, mas:

Fiz a exclusão em na tabela1, depois na tabela 2, tabela3 e na tabela4 ocorre um erro, certo?

O rollback() só volta a consistencia da tabela3, e a 1 e 2, ja era?

Nao tem uma esquema tipo o Transaction do VB, para tratar tudo em um bloco só?

Obs: Paulo a aplicação será multi banco. Tem que funcionar indepente de drive.

Daniel_Quirino_Olive

"
thiagorani":
Obs: Paulo a aplicação será multi banco. Tem que funcionar indepente de drive.

O que o Paulo quis dizer é que o driver que que contém as implementações das interfaces do pacote java.sql (implementações específicas para cada banco de dados) é quem vão fazer o trabalho sujo de controle de transação para você. Logo, se o seu driver JDBC não tiver suporte a transações, os comandos não vão funcionar.

Sobre o problema que você está enfrentando, eu não sei como esta seu código, mas uma sugestão é você criar SavePoints a cada operação com o banco.

thiagorani

Pode cre, vi na API este SavePoint.

Como usar?

Daniel_Quirino_Olive

Olhadinha na API não faz mal… Mas aí vai um exemplo (não testei):

try{
  conn.setAutoCommit(false);
  SavePoint s0 = conn.setSavePoint("sv0");
  // faz alguma coisa...
  SavePoint s1 = conn.setSavePoint("sv1");
  //faz alguma outra coisa e criando SavePoint conforme preciso...
  conn.commit();
}catch(SQLException se){
  conn.rollback(s0); //ou rollback(s1);... de acordo com a sua lógica de negócios...
  // faça o log!!
}

E é isso. :smiley:

Daniel_Quirino_Olive

P.S.: movi este tópico para o “Avançado”, porque ele está “On-Topic” demais para ficar no “Assuntos Gerais”.

thiagorani

Beleza Daniel.

Valeu cara.

thiagorani

Savepoint não funciona via ODBC?

UnsupportedException!

Daniel_Quirino_Olive

Não sei. Nunca tentei. Mas pelo visto não funciona. Logo, procure por um driver JDBC.

Criado 15 de outubro de 2003
Ultima resposta 15 de out. de 2003
Respostas 10
Participantes 3