[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..
public void addProduto(ArrayList<String[]> produtos) throws Exception {
        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 (Exception e) {
            con.rollback();
            e.printStackTrace();
            throw new Exception("addProduto(ArrayList<String[]>)|" + e.getMessage());
        }

    }

2 Respostas

wilsontads

Fiz da seguinte forma, no entanto não consegui atingir o resultado esperado.
=\

public void addProduto(ArrayList<String[]> produtos) throws Exception {
        try {
            con.setAutoCommit(false);//Abre
            st = 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 (Exception e) {
                con.rollback();  //Entra aqui e executa normalmente
            con.setAutoCommit(true);//Fecha a transação
            // As alteraçoes feitas dentro desta transação não sofrem acção do rollback
            e.printStackTrace();
            throw new Exception(e.getMessage());
        }

    }
wilsontads

A aplicação está certa… consegui resolver alterando o engine do MyISAM p/ InnoDB.

Criado 17 de abril de 2012
Ultima resposta 18 de abr. de 2012
Respostas 2
Participantes 1