代码之家  ›  专栏  ›  技术社区  ›  dcp

如果需要,是否需要回滚java.sql.Connection#提交()引发异常?

  •  17
  • dcp  · 技术社区  · 14 年前

    根据 JAVA documentation Connection#commit() 能扔吗 SQLException . 我的问题是在这种情况下是否仍应发出回滚。

    Connection con = null;
    try {
        // assume this method returns an opened connection with setAutoCommit(false)
        con = createConnection(); 
    
        // do DB stuff
    
        con.commit();
    } catch (SQLException e) {
        if (con != null) {
            // what if con.commit() failed, is this still necessary,
            // will it hurt anything?
            con.rollback();
        }
    } finally {
        if (con != null) {
            con.close();
        }
    }
    

    我真的把它包起来了继续回滚()调用另一个方法,该方法忽略它抛出的任何异常,所以我认为我在这里可以。我只是想知道这是不是处理事情的最好方法。

    4 回复  |  直到 14 年前
        1
  •  6
  •   Nikita Rybak    14 年前

    我会做显式回滚只是为了清理的目的。尽管更改不会以任何方式持久化到数据库中,但显式地让数据库知道您已经完成了这一点似乎很好。就像显式关闭连接的方式一样,无需等待连接对象被垃圾收集。

    这显然不是一个技术性的回答,我也很想知道这样做是否有实际意义。

        2
  •  19
  •   MosheElisha    12 年前

    根据 Java 1.6 JDBC docs :

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

    从连接池获取连接时,大多数实现都将执行 connection.setAutoCommit(defaultAutoCommit) 在连接之前,根据JavaDocs:

    如果在事务和自动提交模式期间调用此方法

    如果 connection.rollback() 抛出一个异常-然后是一个棘手的异常。。。

        3
  •  4
  •   Jé Queue    14 年前

    “返回打开的连接?”如果该连接在一个池中共享(并且可能在将来),那么您不希望另一个事务提交您以前的工作。我见过许多客户/解决方案插入符合JDBC接口和 Connection.close() 也可以用于将连接返回到池。

    try{}catch{} 你的 rollback() (编辑,只需阅读整个帖子,但我总是喜欢在回滚时记录异常)

        4
  •  1
  •   Community CDub    7 年前

    我通常的做法是:

    boolean bSuccess = false;
    Connection con = null;
    try {
        // assume this method returns an opened connection with setAutoCommit(false)
        con = createConnection(); 
    
        // do DB stuff
    
        bSuccess = true;
    } catch (SQLException e) 
    {
    }
    finally 
    {
        try
        {
           if (con != null) 
           {
              if(bSuccess)
                 con.commit()
              else
                 con.rollback();
    
              con.close();
           }
        }
        catch(SQLException sqle)
        {
          log("Log the error here");
          // do nothing we tried
        }
    }
    

    也就是说,如果查询有效,我从未见过提交或回滚失败。
    如果您有挂起的事务,那么大多数数据库都有释放它们的工具。大多数应用程序服务器将不断重试提交和回滚,直到它们可以连接。

    你可能想看看这个帖子: Is it necessary to write ROLLBACK if queries fail?