如何解决Connection.rollback() 在 Java 中不起作用
我编写了这个函数来轻松填充我的数据库(mySQL):
public class DelegateCommand : ICommand {
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute)
: this(execute,null) {
}
public DelegateCommand(Action<object> execute,Predicate<object> canExecute) {
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter) {
if (_canExecute == null) {
return true;
}
return _canExecute(parameter);
}
public void Execute(object parameter) {
_execute(parameter);
}
public void RaiseCanExecuteChanged() {
CanExecuteChanged?.Invoke(this,EventArgs.Empty);
}
}
但是它在'chassis'表中添加了一条记录(第一次更新),然后它没有进入while循环('productCode'字段是一个自动增量字段,所以我需要从chassis表中取出它)在“product_code”表中添加一条记录)。 在此之后,它增加 j 变量,在机箱表中执行更新,进入 while 循环并在更新时(在循环中)抛出 SQLException
ResultSet 关闭后不允许操作
但它从不执行回滚。所以我的机箱表中有记录,但 product_code 表是空的。 这是我的 replaceStatement 函数:
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,optional) VALUES ('chassis'," + rs.getInt("productCode") + ",'" + optional[j] + "')");
con.commit();
}
}
}
return true;
} catch (Exception exception) {
exception.printStackTrace();
con.rollback();
return false;
}
}
谁能帮我解决这个问题?
解决方法
您不能提交然后请求回滚。对于与普通 JDBC 一起使用的连接,要么最后进行一次提交,要么在某些语句失败时触发回滚。
所以 con.commit();
应该放在 return true
之前
否则,您可以按照此答案在循环中手动处理多个事务https://stackoverflow.com/a/47482143/7237884
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。