【问题标题】:jdbc autocommit(false) doesnt workjdbc 自动提交(假)不起作用
【发布时间】:2017-11-05 13:43:53
【问题描述】:

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

【问题讨论】:

    标签: java sql jdbc derby


    【解决方案1】:

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

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

    con.setAutoCommit(false);
    

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

    -- EDIT_1

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

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

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

    Connection.close()

    【讨论】:

    • 谢谢,虽然我假设 Commit() 用于验证查询,如果我没有使用 commit,那么查询或事务将被忽略,直到我明确决定 commit()。在我的代码中,我使用了 setautocommit(false),所以,如果我从不 commit(),在块的末尾,将完成一个隐式提交,这是你的意思吗?
    • 好的,我明白了,当我在 insert 之后执行 select * 时,我添加了已打印的新闻行,但是如果我停止程序然后再次执行 select *,我可以看到只保存了提交的指令。所以,有一个技巧,commit() 将结果保存在数据库中,但是为什么我在程序仍在运行时会获得临时结果?
    • @GregArtisi 在事务中执行的语句会看到在同一事务中所做的更改。因此,如果您首先插入一行,然后在同一个事务中选择,您将看到该行(但其他事务不会)。如果您随后回滚事务(例如通过关闭连接或调用rollback()),就好像它从未发生过一样。
    • 请注意,据我所知,大多数数据库驱动程序将在连接关闭时回滚,Oracle 驱动程序是(或曾经)提交的少数例外之一。
    • @MarkRotteveel 同样的事情也发生在 mysql 驱动程序上。在没有明确提交或回滚的情况下关闭连接会导致提交内容。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多