java – 在JDBC中,当autocommit为false并且没有设置显式保存点时,它是好的样式还是浪费回滚?

假设您有以下代码:

Connection conn;
try
{
   conn = ... // get connection
   conn.setAutoCommit(false);

   ... // Do some modification queries and logic

   conn.commit()
} catch(SQLException e)
{
    conn.rollback() // Do we need this?
    conn.close()
}

在这段代码中,如果有一个异常,是否更好的风格来关闭连接(因为自动提交关闭),还是显式回滚然后关闭连接?没有保存点。

我觉得添加回滚调用可能是有意义的,因为:

1)有人,在将来,可能会添加保存点,但忘记添加回滚

2)提高可读性

3)它不应该花任何东西,对吧?

但显然,这些都不是特别引人注目。任何标准做法?

注意:我知道需要重复try / catch关闭和回滚。我实际上有一个中间件抽象数据库访问和照顾,但我想知道是否添加它是多余的。

正常习语如下:

public void executeSomeQuery() throws SQLException {
    try (Connection connection = dataSource.getConnection()) {
        connection.setAutoCommit(false);

        try (PreparedStatement statement = connection.prepareStatement(SOME_SQL)) {
            // Fire transactional queries here.

            connection.commit();
        } catch (SQLException e) {
            connection.rollback();
            throw e;
        }
    }
}

注意,Java 7的try-with-resources statement总是在try块完成时隐含地调用资源上的close(),就好像它在finally中一样。

当涉及池连接时,调用rollback()也是必需的。即,它将重置连接的事务状态。 pooled连接的close()不会这样做,只有commit()和rollback()才会这样做。不调用rollback()可能导致池连接的下一个租用仍然具有在其内存中的前一个事务的(成功)查询。

参见Connection#close()的javadoc(强调不是我的):

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.

http://stackoverflow.com/questions/3160756/in-jdbc-when-autocommit-is-false-and-no-explicit-savepoints-have-been-set-is-i

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 在JDBC中,当autocommit为false并且没有设置显式保存点时,它是好的样式还是浪费回滚?