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
之前
否则,您可以按照此答案
在循环内手动处理多个事务
我写这个函数是为了轻松填充我的数据库(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
否则,您可以按照此答案
在循环内手动处理多个事务