java - JDBC 确定 Activity 事务

标签 java jdbc

是否可以通过 JDBC 确定我处于未提交的 Activity 事务中? 我想确保在 Connection.close() 之前所有事务都已提交或回滚。

最佳答案

没有标准的 JDBC 方法可以满足您的需求。但是如果你想确保在 Connection.close() 之前所有事务都已提交/回滚,你可以这样做:

Connection conn = null;

try {
    conn = ...;
    conn.setAutoCommit(false);

    // do stuff

    // commit only if everything is successful
    conn.commit();
}
catch (SomeException e) {
    // log exceptions
}
finally {
    if (conn != null) {
        /* ALWAYS rollback before closing the connection
         * if there's any caught/uncaught exception, the transaction will be rolled back
         * if everything is successful / commit is successful, the rollback will have no effect
         */
        try {
            conn.rollback();
        }
        catch (SQLException e) {}

        try {
            conn.close();
        }
        catch (SQLException e) {}
    }
}

这比仅在出现异常(在 catch block 中)时回滚要好,因为如果有任何未捕获的异常:

  • rollback() 不会被调用
  • Connection.close() 将在存在 Activity 事务时调用, Activity 事务发生的情况是特定于实现的。参见 Bogdan Calmac's answer .

关于java - JDBC 确定 Activity 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26652612/

相关文章:

java - Maven 未将依赖项复制到 Eclipse 中的 WEB-INF/lib

java - 线程 "main"java.lang.IllegalMonitorStateException 中的异常

java - Eclipse 将源文件夹与包文件夹混淆

Java连接OracleDB : java. sql.SQLRecoverableException: IO error: The pipe has been cut

java - 我在哪里可以找到 JDK 8 中的 derby.jar?

java - Jar 文件找不到 com.mysql.jdbc 驱动程序

java - 为什么我在调用 ResultSet.refreshRow() 时看到 NotUpdatable?

java - MySQL 的 Jboss 数据源配置 - MysqlXADataSource 元素

java - 实现自定义 compareTo

java - 意外的 GDS 异常 : 335544726. 从连接读取数据时出错