jdbc autocommit(false)不起作用

时间:2017-06-04 19:11:47

标签: java sql jdbc derby

我对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();
    }

1 个答案:

答案 0 :(得分:2)

自动提交意味着每个单独的SQL语句都被视为一个事务,并在执行后立即自动提交。默认情况下,SQL语句在完成时提交,而不是在执行时提交。检索到所有结果集和更新计数后,语句即完成。但是,在几乎所有情况下,语句都会在执行后立即完成,并因此被提交。

允许将两个或多个语句分组到事务中的方法是禁用自动提交模式。

con.setAutoCommit(false);

禁用自动提交模式时,在显式调用方法提交之前,不会提交任何SQL语句。在上一次调用方法提交之后执行的所有语句都包含在当前事务中,并作为一个单元一起提交。

- EDIT_1

可能会提交更新,因为您在未调用rollback()的情况下关闭了连接。

如果在没有显式提交或回滚的情况下关闭Connection,则行为取决于数据库。

  

强烈建议应用程序显式提交或   在调用close方法之前回滚活动事务。如果   调用close方法并且有一个活动事务,即   结果是实现定义的。

Connection.close()