Java jdbc自动提交(false)不起作用
关于Java jdbc自动提交(false)不起作用,java,sql,jdbc,derby,Java,Sql,Jdbc,Derby,关于java.sql.Connection.commit(),我有一点不明白 我使用Derby(JavaDB)作为数据库服务器 当我执行setAutoCommit(false)时,我希望在显式调用commit()方法之前,查询不会工作。 但事实上,即使我不调用commit(),它仍然会提交。 当我在表上调用select*来打印内容时,我可以看到行已经被添加,即使我没有显式提交查询 有人能给我解释一下吗 con.setAutoCommit(false); PreparedState
java.sql.Connection.commit()
,我有一点不明白
我使用Derby(JavaDB)作为数据库服务器
当我执行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();
}
自动提交意味着每个单独的SQL语句都被视为一个事务,并在执行后立即自动提交。默认情况下,SQL语句在完成时提交,而不是在执行时提交。当检索到一条语句的所有结果集和更新计数时,该语句即告完成。然而,在几乎所有情况下,语句都是在执行后立即完成并提交的 允许将两个或多个语句分组到一个事务中的方法是禁用自动提交模式
con.setAutoCommit(false);
禁用自动提交模式时,在显式调用commit方法之前,不会提交任何SQL语句。上次调用commit方法后执行的所有语句都包含在当前事务中,并作为一个单元一起提交
--编辑\u 1
更新可能已提交,因为您正在关闭连接而未调用rollback()
如果在没有显式提交或回滚的情况下关闭连接,则行为取决于数据库
强烈建议应用程序显式提交或
在调用close方法之前回滚活动事务。如果
调用close方法,并且存在一个活动事务,即
结果由实现定义
谢谢,我认为Commit()应该用来验证查询,如果我没有使用Commit,那么查询或事务将被忽略,直到我明确决定Commit()。在我的代码中,我使用了setautocommit(false),因此,如果我从不提交(),在块的末尾,将执行隐式提交,这就是你的意思吗?好吧,我理解了一些事情,当我在插入后执行select*时,我添加了打印的新闻行,但是如果我停止程序,然后再次执行select*,我可以看到,只有提交的指令已保存。因此,这里有一个技巧,commit()将结果永久保存在数据库中,但是为什么在程序仍在运行时我会获得临时结果呢?@GregArtisi语句在事务中执行,以查看同一事务中所做的更改。因此,如果您首先插入一行,然后在同一事务中选择,您将看到该行(但其他事务不会)。如果然后回滚事务(例如通过关闭连接或调用
rollback()
),就好像从未发生过一样。请注意,大多数数据库驱动程序都会在连接关闭时回滚,据我所知,Oracle驱动程序是(或曾经是)这是为数不多的异常之一。@MarkRotterVeel同样的事情也发生在mysql驱动程序上。在没有显式提交或回滚的情况下关闭连接会导致提交内容。