我对java.sql.Connection.commit()
无法理解。
我使用Derby(Java DB)作为数据库服务器。
当我执行 setAutoCommit(false)时,我希望在显式调用commit()方法之前我的查询不起作用。 但事实上,即使我没有调用commit(),它仍然会提交。 当我在我的表上调用select *来打印内容时,我可以看到已经添加了行,即使我没有显式提交查询。
请问有人给我一些解释吗?
con.setAutoCommit(false);
PreparedStatement updateHair = null;
PreparedStatement addMan = null;
try {
String updateString =
"update PERSONNE " +
"set haircolor = 'RED' where haircolor = 'SHAVE'";
String updateStatement =
"insert into personne values " +
"(3,'MICHEL','SHAVE')";
addMan = con.prepareStatement(updateStatement);
addMan.executeUpdate();
updateHair = con.prepareStatement(updateString);
updateHair.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:2)
自动提交意味着每个单独的SQL语句都被视为一个事务,并在执行后立即自动提交。默认情况下,SQL语句在完成时提交,而不是在执行时提交。检索到所有结果集和更新计数后,语句即完成。但是,在几乎所有情况下,语句都会在执行后立即完成,并因此被提交。
允许将两个或多个语句分组到事务中的方法是禁用自动提交模式。
con.setAutoCommit(false);
禁用自动提交模式时,在显式调用方法提交之前,不会提交任何SQL语句。在上一次调用方法提交之后执行的所有语句都包含在当前事务中,并作为一个单元一起提交。
- EDIT_1
可能会提交更新,因为您在未调用rollback()
的情况下关闭了连接。
如果在没有显式提交或回滚的情况下关闭Connection,则行为取决于数据库。
强烈建议应用程序显式提交或 在调用close方法之前回滚活动事务。如果 调用close方法并且有一个活动事务,即 结果是实现定义的。