admin

jdbc autocommit(false)不起作用

sql

我有些不了解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();
    }

阅读 276

收藏
2021-06-07

共1个答案

admin

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

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

con.setAutoCommit(false);

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

-编辑_1

由于您是在不致电的情况下关闭Connection的,因此可能会提交更新rollback()

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

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

Connection.close()

2021-06-07