Connection.rollback() 在 Java 中不起作用

Connection.rollback() doesn't work in Java

我写这个函数是为了轻松填充我的数据库(mySQL) :

public boolean addItems(Connection con) throws SQLException {
    try {
        con.setAutoCommit(false);
        String[] brands = { "Honda", "BMW", "Mercedes Benz" };
        String[] optional = { "acciaio", "alluminio", "carbonio", "titanio" };
        Statement statement = con.createStatement();
        for (int i = 0; i < brands.length; i++) {
            for (int j = 0; j < optional.length; j++) {
                statement.executeUpdate("INSERT INTO chassis (idUnit, brand, material, availableItems) VALUES (1, '" + brands[i] + "', '" + optional[j] + "', 20)");
                statement = Condb.replaceStatement(statement);
                ResultSet rs = statement.executeQuery("SELECT * FROM chassis WHERE brand = '" + brands[i] + "' AND material = '" + optional[j] + "'");
                while (rs.next()) {
                    statement = Condb.replaceStatement(statement);
                    statement.executeUpdate("INSERT INTO product_code (unitName, productCode, brand, optional) VALUES ('chassis', " + rs.getInt("productCode") + ", '" + brands[i] + "', '" + optional[j] + "')");
                    con.commit();
                }
            }
        }
        return true;
    } catch (Exception exception) {
        exception.printStackTrace();
        con.rollback();             
        return false;
    }
}

但是在'chassis'table中添加了一条记录(第一次更新),然后没有进入while循环('productCode'字段是自增字段,所以我需要从机箱 table 中取出它,以便在 'product_code' table 中添加一条记录。 此后,它增加 j 变量,在底盘 table 中执行更新,进入 while 循环并在更新时(在循环中)抛出 SQLException

Operation not allowed after ResultSet closed

但它从不执行回滚。所以我的机箱里有记录 table,但是 product_code table 是空的。 这是我的 replaceStatement 函数:

public static Statement replaceStatement(Statement stmt) {
    try {
        stmt.close();
        Statement statement = Condb.initializeDatabase().createStatement();
        return statement;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

谁能帮我解决这个问题?

您不能提交然后请求回滚。对于使用纯 JDBC 的连接,要么在最后进行一次提交,要么在某些语句失败时触发回滚。

所以con.commit();应该放在return true

之前

否则,您可以按照此答案

在循环内手动处理多个事务