java - 回滚不起作用

标签 java mysql transactions

我想在发生异常时回滚所有已插入表的记录。

但是conInsert.rollback()不起作用。

也许我错过了一些代码?

这是我的代码

        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(connectionUrl);
            //con.setAutoCommit(false);
            Statement st = con.createStatement();

            String querySelectOrderInTp = "SELECT order_in_tp_id, order_in_tp_qty, order_in_tp_price, order_in_tp_article_tc_id, order_in_tp_warehouse_tc_id, inv_stock_tp_id, inv_stock_tp_qty_available from order_in_tp LEFT JOIN inv_stock_tp on(order_in_tp_warehouse_tc_id=inv_stock_tp_whouse_current_id AND order_in_tp_article_tc_id=inv_stock_tp_article_tc_id AND order_in_tp_price=inv_stock_tp_price) where order_in_tp_pick_up_timestamp = 'A' AND order_in_tp_date = '2013-06-11' GROUP BY order_in_tp_id;";
            ResultSet rs = st.executeQuery(querySelectOrderInTp);

            String queryUpdateInvStockTp = "INSERT INTO inv_stock_tp (cre_tms,upd_tms,cre_usr,upd_usr,version,usr_act,inv_stock_tp_id,inv_stock_tp_key, inv_stock_tp_whouse_current_id,inv_stock_tp_article_tc_id,inv_stock_tp_qty_available,inv_stock_tp_qty_min,inv_stock_tp_price) VALUES (NOW(),NOW(),'demo2','demo2',1,'A',null,'AAAA',?,?,?,0,2000.0000)";
            conInsert = DriverManager.getConnection(connectionUrl);
            conInsert.setAutoCommit(false);
            ps = conInsert.prepareStatement(queryUpdateInvStockTp);

            String queryUpdateOrderInTp = "UPDATE order_in_tp set order_in_tp_pick_up_timestamp = ? WHERE order_in_tp_id = ?";
            psUpdate = con.prepareStatement(queryUpdateOrderInTp);

            while(rs.next()) {
                Integer qty = rs.getInt(7) - rs.getInt(2);

                ps.setString(1, rs.getString(5));
                ps.setString(2, rs.getString(4));
                ps.setString(3, rs.getString(2));
                ps.execute();

                psUpdate.setString(1, "A");
                psUpdate.setString(2, rs.getString(1));
                psUpdate.execute();
                ps.clearParameters();
                psUpdate.clearParameters();
            }
            conInsert.commit();
        } catch (Exception e) {
            e.printStackTrace();
            if (conInsert != null) {
                try {
                    System.err.print("Transaction is being rolled back");
                    conInsert.rollback();
                } catch (SQLException excep) {
                    excep.printStackTrace();
                }
            }
        }

我在最后一条记录中做了异常(exception),但它之前的所有记录仍然已插入。

最佳答案

默认情况下,MySQL 运行时启用自动提交模式。这意味着一旦您执行更新(修改)表的语句,MySQL 就会将更新存储在磁盘上以使其永久化。我不懂java,但请确保您有START TRANSACTION语句,然后COMMIT或ROLLBACK。

关于java - 回滚不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17610090/

相关文章:

java - 为什么 Eclipse 崩溃 Xmx, XX :MaxPermSize above certain values?

mysql - 尽管 PHP 魔术引号成功 SQL 注入(inject)

php - 多次点击提交按钮后出现重复问题

php - MYSQL 查询执行很慢

mongodb - 文档DB和模拟ACID

java - 我想显示数组列表中的元素,而不是哈希码

java - System.lineSeparator() 在 android 中不存在

java 如何在循环中使用1个扫描仪

java - @Transactional 不适用于方法级别

mysql - 在事务中插入多行,如果其中一行失败,则插入其余行