有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java jdbc自动提交(false)不起作用

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

共 (1) 个答案

  1. # 1 楼答案

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

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

    con.setAutoCommit(false);
    

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

    编辑_1

    更新可能已提交,因为您正在关闭连接而不调用rollback()

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

    It is strongly recommended that an application explicitly commits or rolls back an active transaction prior to calling the close method. If the close method is called and there is an active transaction, the results are implementation-defined.

    Connection.close()