【问题标题】:What is use of Connection.setAutoCommit(false); when using Oracle database?Connection.setAutoCommit(false) 有什么用;什么时候使用Oracle数据库?
【发布时间】:2017-02-14 21:14:21
【问题描述】:

我在创建连接后立即设置con.setAutoCommit(false);,以便在数据库中没有任何内容未提交。但事实证明,如果您关闭连接,所有事务都将被提交,无论您的 setAutoCommit() 状态如何。

    Class.forName("oracle.jdbc.driver.OracleDriver");
        con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.7.5:xxxx:xxx", "xxx", "xxx");

        con.setAutoCommit(false);

        st = con.createStatement();
        String sql = "INSERT INTO emp (eid, name, dob, address) VALUES (?, ?, ?, ?)";
        PreparedStatement statement = con.prepareStatement(sql);
        statement.setInt(1, 8 );
        statement.setString(2, "kkk" );
        statement.setDate(3, date );
        statement.setString(4, "pppp" );
        pst = con.prepareStatement(sql);
        int rowsInserted = statement.executeUpdate();

        //con.commit ();

        System.out.println ("rowsInserted "+rowsInserted);

        con.close ();

即使在评论 con.commit (); 连接关闭时插入行之后,所以我想知道 con.commit (); 的用途是什么?

Another answer 表示它是特定于供应商的:

如果连接在没有明确提交或回滚的情况下关闭; JDBC 在这里没有特别要求任何东西,因此行为取决于数据库供应商。如果是 Oracle,则会发出隐式提交。

这没有意义。谢谢。

【问题讨论】:

  • 您通常不会只为单个语句打开连接。您保持打开状态(例如在连接池中)。如果您使用自动提交,您将如何回滚多语句事务?
  • Oracle 在其文档中对transanction 有很好的定义。但是,当您调用 close 方法时,实际发生的一切都是单个事务的形式,该事务遵循其 ACID 属性,该属性指出事务后的每个语句都必须完成,这就是它保存数据的原因。
  • 请注意,如果您在没有显式提交或回滚的情况下关闭连接,其他 JDBC 驱动程序可能会回滚。

标签: java database oracle jdbc


【解决方案1】:

con.commit() 是显式提交,您可以在必须提交事务时调用它。在您的情况下,尽管您已将 AutoCommit 设置为 false,但没有显式提交或回滚。 Oracle 数据库提交会话的所有事务,从而优雅地退出连接。如果会话异常终止,则回滚事务。

【讨论】:

    【解决方案2】:

    Oracle documentation 很好地解释了何时以及为什么应该使用它。请通过同样的方式!

    如果您的 JDBC 连接以编程方式或默认情况下处于自动提交模式(这是默认情况下,仅供参考),则每个 SQL 语句在完成后都会提交给数据库。

    您可以参考this问题以获取有关同一主题的更详细说明。

    【讨论】:

    • 谢谢!需要这个答案。我用其他标签打开了该文档,但我没有阅读它。文档第一,经验教训。
    【解决方案3】:

    注销 Oracle 会提交任何待处理的事务。无论您使用 sqlplus 还是通过conn.close() 使用 JDBC 驱动程序,都会发生这种情况。请注意,发出提交的不是驱动程序,而是服务器。在注销期间,服务器提交挂起的更改。在您的 Java 程序中,如果您想确保未提交未决的更改,您始终可以在调用 conn.close() 之前调用 conn.rollback()

    你问conn.commit() 有什么用。它用于在业务逻辑的特定点显式提交事务。例如,如果您在连接池中缓存连接,则可以在将连接释放回池之前禁用自动提交和提交挂起的更改。有些人更喜欢启用自动提交模式(这是 JDBC 中的默认模式),而不用担心显式提交或回滚更改。这取决于您的业务逻辑。您可以问自己:我是否需要回滚 DML 执行?如果答案是肯定的,那么您应该禁用自动提交并明确提交事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多