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?
Transacao
12 Respostas
Usando JDBC puro?
conn.setAutoCommit( false );
try {
// executa os SQLs
conn.commit();
} catch( Exception e ) {
conn.rollback();
}
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?
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.
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?
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!
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?
Pode sim… desde que você use a mesma conexão… pq senão você não consegue estabelecer uma transação.
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;
}
E porque não daria?
Faça os testes e veja por si 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?
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).
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.