[RESOLVIDO]ingleton trabalhando commit e rollback com JDBC
2 respostas
wilsontads
Pessoal, criei uma classe Singleton, que me retorna sempre uma connection da seguinte forma..
con = getConnection();
con.setAutoCommit(false);
Dado isto, eu crio meus Statements e meus ResultSets nos DAO's..
funciona tudo perfeito, menos o rollback, como vocês podem ver abaixo, simulei uma falha na linha 12, de maneira com quem o update executado anteriormente fosse desfeito. Mais isso não vem acontecendo na prática..
publicvoidaddProduto(ArrayList<String[]>produtos)throwsException{try{st=con.getStatement();ps=con.prepareStatement("insert into produto (peso, descricao,fornecedor) values(?,?,?)");for(String[]produtoLocal:produtos){ps.setObject(1,produtoLocal[0]);ps.setObject(2,produtoLocal[1]);ps.setObject(3,produtoLocal[2]);ps.executeUpdate();st.executeUpdate("delete from cat_produto_removido where id_produto 32="+produtoLocal[0]);}st.close();rs.close();con.commit();}catch(Exceptione){con.rollback();e.printStackTrace();thrownewException("addProduto(ArrayList<String[]>)|"+e.getMessage());}}
Fiz da seguinte forma, no entanto não consegui atingir o resultado esperado.
=\
publicvoidaddProduto(ArrayList<String[]>produtos)throwsException{try{con.setAutoCommit(false);//Abrest=con.getStatement();ps=con.con.prepareStatement("insert into produto ( descricao,fornecedor) values(?,?,?)",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);for(String[]produtoLocal:produtos){ps.setObject(1,produtoLocal[0]);ps.setObject(2,produtoLocal[1]);ps.setObject(3,produtoLocal[2]);ps.executeUpdate();st.executeUpdate("delete from produto_removido where id_produto 32="+produtoLocal[0]);//Aqui provoco exceção... deveria desfazer o update da linha acima.}con.commit();con.setAutoCommit(true);}catch(Exceptione){con.rollback();//Entra aqui e executa normalmentecon.setAutoCommit(true);//Fecha a transação// As alteraçoes feitas dentro desta transação não sofrem acção do rollbacke.printStackTrace();thrownewException(e.getMessage());}}
wilsontads
A aplicação está certa… consegui resolver alterando o engine do MyISAM p/ InnoDB.