0

我正在尝试实施某种交易并不断失败。

这是我的代码:

PreparedStatement ac = con.prepareStatement("UPDATE Stock "
        + "SET Stock= Stock - ('"+stockinput+"')"
        + "WHERE StockID =('"+stockID+"')");
ac.executeUpdate();
PreparedStatement dc = con.prepareStatement("SELECT StockAmount FROM Stock");
ResultSet results = dc.executeQuery();
while(results.next()){
    int temp = Integer.parseInt(results.getString("StockAmount"));
    if(stockinput < temp ){
        con.rollback();
    }
    else{
        con.commit();
    }
}

但是,它不会回滚。

花了将近一个小时试图找到解决办法。

如果有人可以帮助我,我将不胜感激。

4

2 回答 2

1

你忘记了第一行。

我建议您需要了解有关 JDBC 的更多信息。谁会傻到使用 PreparedStatement 而不使用绑定变量?

反正我不喜欢这个逻辑。如果库存量不应该为负数,我会将其添加为数据库中的约束。为什么要在完成更新后检查?之前检查。这段代码意义不大。

// i don't see this in your code.
con.setAutoCommit(false);
PreparedStatement ac = con.prepareStatement("UPDATE Stock "
        + "SET Stock= Stock - ('"+stockinput+"')"
        + "WHERE StockID =('"+stockID+"')");
ac.executeUpdate();
PreparedStatement dc = con.prepareStatement("SELECT StockAmount FROM Stock");
ResultSet results = dc.executeQuery();
while(results.next()){
    int temp = Integer.parseInt(results.getString("StockAmount"));
    if(stockinput < temp ){
        con.rollback();
    }
    else{
        con.commit();
    }
}
于 2013-06-27T01:47:13.847 回答
0

将连接设置为自动提交(假);

con.setAutoCommit(false);

如何使用准备好的语句:

PreparedStatement ac = con.prepareStatement("UPDATE Stock "
        + "SET Stock= Stock - (?) "
        + "WHERE StockID = ?;
ac.setInt(1, stockinput); // setString or whatever data type
ac.setString(2, stockID);

PreparedStatements 预编译并存储在 SQL 语句中。然后可以使用该对象多次有效地执行该语句。

于 2013-06-27T02:09:44.940 回答