【问题标题】:what happens on connection.setAutoCommit = falseconnection.setAutoCommit = false 会发生什么
【发布时间】:2015-09-23 12:31:46
【问题描述】:

如果我执行connection.setAutoCommit(false); 会发生什么,它会在数据库端创建一个新事务吗?

【问题讨论】:

标签: java jdbc connection autocommit


【解决方案1】:

根据documentationconnection.setAutoCommit(false) 将允许您在同一事务下分组多个后续Statements。此事务将在调用 connection.commit() 时提交,而不是在每个 execute() 调用单个 Statements 之后(如果启用自动提交,则会发生这种情况)。

通过connection.setAutoCommit() 更改自动提交模式将隐式提交活动事务并创建一个新事务。来自Javadocs

注意:如果在事务期间调用此方法并且更改了自动提交模式,则事务将被提交。如果调用了 setAutoCommit 并且自动提交模式没有改变,则调用是空操作。

【讨论】:

  • connection.commit() 结束交易,但我很想知道交易何时开始?
  • 实际上,更改自动提交模式确实会创建一个新事务。我修改了答案。
  • @MickMnemonic 是什么意思“如果调用了 setAutoCommit 并且没有更改自动提交模式,则该调用是无操作的。”
  • @shiva_R,这意味着该方法不会做任何事情,例如自动提交已启用,您调用 setAutoCommit(true)
【解决方案2】:

JDBC API 中每个方法的实现依赖于每个驱动程序。 Oracle 可能会做一些与 MySql 完全不同的事情。

但是,仅调用 connection.setAutoCommit(false); 不会创建事务。这仅意味着当您调用connection.commit(); 时,使用此连接创建的任何语句都将被一起提交。

看看thisOracle 教程。

【讨论】:

  • 我只是想知道,所以在执行第一条语句时,事务是在数据库端启动的?
  • 嗯,这取决于驱动程序。每个供应商可能有不同的行为。我不知道事务从哪里开始,但就我而言,这并不重要,因为所有实现都必须完全满足 JDBC API 的要求。
【解决方案3】:

JavaDocs 在Using Transactions Section 中对这个用例提供了很好的解释

禁用自动提交模式

创建连接时,它处于自动提交模式。这表示 每个单独的 SQL 语句都被视为一个事务,并且是 执行后立即自动提交。 (为了更 准确地说,默认是在提交 SQL 语句时提交 完成,而不是执行时。当所有的语句完成时 其结果集和更新计数已被检索。在几乎 但是,在所有情况下,声明都已完成,因此已提交, 执行后立即执行。)

允许将两个或多个语句组合成一个 事务是禁用自动提交模式。这被证明 在以下代码中,其中 con 是一个活动连接:

con.setAutoCommit(false);

【讨论】:

    【解决方案4】:

    让我用代码简单解释一下。当我们申请了

    Connection.setAutoCommit(false);

    在我们的源代码中,它将禁用自动提交选项,默认情况下在数据库中启用。

    所以,你必须打电话

    Connection.commit();

    方法显式持久化对数据库的任何更改。

    Class.forName(drivers);
    Connection dbConnnection=DriverManager.getConnection(connectionURL,username,password);
    dbConnection.setAutoCommit(false); //Disabling the Autocommit
    Statement selectStatement = dbConnection.createStatement("Select Query");
    ResultSet rs = selectStatement.execute();
    while(rs.next()){
        Statement updateStatement = dbConnection.createStatement("update Query");
        //Apply some changes to update record
        statement.execute();
        dbConnection.commit();  //Mandatory to execute to persist changes into database
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 1970-01-01
      • 2011-08-06
      • 2022-01-07
      • 2019-10-07
      • 2014-03-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多