Transacao

12 respostas
S

Boa tarde pessoal.
Preciso fazer uma transacao. + por onde eu comeco?
Alguem tem uma dica de um tuto, que me ajude a comecar com isto?

12 Respostas

danieldestro

Usando JDBC puro?

conn.setAutoCommit( false ); try { // executa os SQLs conn.commit(); } catch( Exception e ) { conn.rollback(); }

S

Isto é como fazer ne.
Vamu la …
O que eu preciso fazer é alterar duas tbs diferentes, caso ocorra algum erro na segunda alteracao ele volta e refaz a primeira. (acho q isto é transãção, né…).
Este codigo eu devo colocar na minha classe de database ou negocio?

danieldestro

Não. Na transação, quando um comando falha, todos os outros executados devem ser desfeitos, ou seja, se falhou o segundo, o primeiro tem de ser desfeito.

E geralmente isso fica na camada de acesso a dados.

S
entao



conn.setAutoCommit( false );

try {
tudo estiver aqui faz parte da transacao entao? tipo

delete * from Td_clientes WHERE id = 1;

delete * from Td_contatos WHERE id_cliente = 1;

/<em>Dai caso ocorra um erro na exclusao do contato ele volta e devolve

o cliente antes excluido? é isto ?</em>/
conn.commit();

} catch( Exception e ) {

conn.rollback();

}

E geralmente isso não na camada de acesso a dados.

Oq vc quiz dizer? devo fazer a transacao na camada de negocios?
danieldestro

Imagine:

insert into tabela_a ... delete from tabela_b ... update tabela_b ... //DÁ PAU NO PRÓXIMO SQL delete from tabela_c

Então todos os comandos executados são desfeitos pelo BD. Ou seja, é como se nada disso tivesse sido executado.

corrigi!

S

Agora me diz…
Eu posso mandar executar alguns metodos dentro deste
try{} pq é assim. Na minha classe de negocios eu tenho os metodo separado. IN UP DEL …
dai por ex se eu tenho uma transacao q faz 2 IN e um Del, eu posso colocar a chamada deste metodos no bloco try?

danieldestro

Pode sim… desde que você use a mesma conexão… pq senão você não consegue estabelecer uma transação.

S
posso colocar num boolena assim?

public boolean trans(String sql){

conn.setAutoCommit(false);

try {

// executa os SQLs

conn.commit();

return true;

} catch(Exception e) {

conn.rollback();

return false;

}

return false;

}
danieldestro

E porque não daria?
Faça os testes e veja por si só.

S

Mano sua ajuda esta sendo muito válida.

O que vc ta dizendo nesta linha?:
conn.setAutoCommit(false);

To usando o potgres. e ela ta dando um erro:
SET AUTOCOMMIT TO OFF is no longer supported.

se eu ponho true ele ate para de reclamar + nao funciona.
Outra coisa é preciso tratarr com throws?

danieldestro

http://java.sun.com/j2se/1.3/docs/api/java/sql/Connection.html#setAutoCommit(boolean)

Dependendo do Container que vc estiver usando, ele mesmo pode controlar isso para você. Dá uma procurada na documentação do seu container (app server).

H

cara tava lendo sobre isso e vo tentar te ajudar:

pelo q vi existem 2 maneiras de tratar transacoes:

1- seria delsigar o autoCommit e colocar o comando commit no teu codigo e dai se ocorrer 1 excecao ele retorna c rollBack, como o cara colocou ai.

2- fazer 1 operacao atomica (vi isso em 1 slide), era mais ou menos assim:

begin atomic

end

ai vc ve no teu banco como faz isso, acho q c esta operacao n precisa mudar o autocommit do banco.

espero ter ajudado.

Criado 31 de agosto de 2006
Ultima resposta 1 de set. de 2006
Respostas 12
Participantes 3