使用 Java PreparedStatements 时,提交会使对数据库的任何更改永久化。我想了解的是这意味着什么。特别是,我可以在提交之前从插入语句中读取生成的 key 吗?我可以在执行提交之前使用从数据库中检索到的值在我的插入语句后跟一个更新语句,如以下代码片段所示吗?或者我应该在第一个插入语句之后进行提交,然后在更新语句之后进行第二次提交。
String insertString = "insert into charges(acct,servicedate,cdmcode,price,quantity,revenuecode,chargeid,id,mod) values (?,?,?,?,?,?,?,?,?)";
String updateString = "update charges set chargeid = ? where indx = ?";
try {
connection.setAutoCommit(false);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
insertcharge = connection.prepareStatement(insertString,Statement.RETURN_GENERATED_KEYS);
insertcharge.setString(1, newacct);
insertcharge.setString(2, servicedate);
insertcharge.setString(3, cdmcode);
insertcharge.setString(4, price);
insertcharge.setString(5, quantity);
insertcharge.setString(6, revenuecode);
insertcharge.setString(7, "0");
insertcharge.setString(8, id);
insertcharge.setString(9, mods);
insertcharge.executeUpdate();
ResultSet rs = insertcharge.getGeneratedKeys();
int thekey = 0;
if (rs.next()){
thekey = rs.getInt(1);
}
insertcharge = connection.prepareStatement(updateString);
insertcharge.setInt(1, thekey);
insertcharge.setInt(2, thekey);
insertcharge.executeUpdate();
connection.commit();
最佳答案
当您禁用自动提交时,您的每个 SQL 语句都在一个事务中执行,然后在您调用 commit
时作为一个原子单元提交。如果任何语句在提交中失败,则整个事务失败,您可以将其全部回滚。
如果您希望您的代码以这种方式运行,那么您应该在一个事务中完成所有操作。
如果你想拥有多个事务,以便每个 block 彼此独立提交,你也可以这样做。
您使用一个还是多个事务会受到您的业务逻辑/需求的影响。
这里有一个例子展示了如何回滚它们 http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html
关于java - PreparedStatements中commit方法的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20848878/