Java Connection.close是否回滚?

Java Connection.close是否回滚?,java,transactions,database-connection,Java,Transactions,Database Connection,Java Connection.close是否回滚到finally块 我知道.Net SqlConnection.close可以做到这一点 有了这个,我可以尝试/最终不被捕获地阻塞 例如: try { conn.setAutoCommit(false); ResultSet rs = executeQuery(conn, ...); .... executeNonQuery(conn, ...); .... conn.commit(); } fi

Java Connection.close是否回滚到finally块

我知道.Net SqlConnection.close可以做到这一点

有了这个,我可以尝试/最终不被捕获地阻塞

例如:

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.close();
}

根据,在调用close方法之前,应该尝试提交或回滚。否则,结果由实现定义。

根据,在调用close方法之前,应尝试提交或回滚。否则,结果是由实现定义的。

如果您打算编写多平台JDBC代码,则不应依赖此行为。

如果您打算编写多平台JDBC代码,则不应依赖此行为。

在我使用过的任何数据库系统中,在提交后立即回滚都没有坏处,因此,如果在try块中提交,并在finally块中回滚,则会提交事务,而如果异常或提前返回导致提交丢失,回滚将回滚事务。所以安全的做法是

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}

在我使用过的任何数据库系统中,在提交后立即回滚都没有坏处,因此如果在try块中提交,在finally块中回滚,则会提交内容,而如果异常或早期返回导致提交丢失,回滚将回滚事务。所以安全的做法是

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}

在finally块中回滚是无用的。在您提交之后,并且提交成功,为什么要回滚?所以如果我是你,我会在接球区打滚

在finally块中回滚是无用的。在您提交之后,并且提交成功,为什么要回滚?所以如果我是你,我会在接球区打滚

不同数据库之间的行为完全不同。示例:

神谕 在使用打开的事务关闭连接时提交事务(如@Mr.shinny and New)安宇 声明

SQL Server

在事务的中间调用关闭方法导致 要回滚的事务


不同数据库之间的行为完全不同。示例:

神谕 在使用打开的事务关闭连接时提交事务(如@Mr.shinny and New)安宇 声明

SQL Server

在事务的中间调用关闭方法导致 要回滚的事务


对于MySQL JDBC,如果关闭连接而不调用提交或回滚方法,则实现将回滚连接。

对于MySQL JDBC,如果关闭连接而不调用提交或回滚方法,则实现将回滚连接。

如果我没有弄错,SQL Server将对此进行投诉m not mistake这不是无用的。如果在commit()之前发生异常,但在当前事务中成功执行之后,则您很可能希望在退出具有连接访问权限的块之前回滚该事务。这不是无用的。如果在commit()之前发生异常但是在当前事务中成功执行之后,您很可能希望在退出具有连接访问权限的块之前回滚该事务。