java - JDBC Connection 的 rollback 方法在哪里调用?

 Amandadahl 发布于 2022-10-25 11:25

不带事务的代码是这样的(外层的try-catch已省略):

Connection conn = getConnection();
try {
    Statement stmt = conn.createStatement();
    stmt.executeUpdate(sql1);
    stmt.executeUpdate(sql2);
} finally {
    conn.close();
}

如果要添加事务,rollback在哪里调用?

  1. 如果在catch中调用,那么捕获哪个异常?如果仅仅捕获SQLException,那么抛出其它异常的时候怎么办?如果捕获Exception,那么抛出的异常目前没法处理(例如RuntimeException)又怎么办?

  2. 如果在finally中调用,我怎么区分正常和异常情况?

2 个回答
  • try (Connection conn = null) {
        conn.setAutoCommit(false);
        try (Statement stmt = conn.createStatement()) {
            stmt.executeUpdate(sql1);
            stmt.executeUpdate(sql2);
            conn.commit();
        } catch (SQLException | RuntimeException e) {
            e.printStackTrace();
            conn.rollback();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

    如果你觉得需要的话, 可以把RuntimeExceptionrollback了,但是上面的情况下,我觉得更应该考虑为什么会抛出RuntimeException

    2022-10-26 23:21 回答
    1. Exception无法捕获RuntimeException的吗?

    2. JDBC你只需要处理SQLException即可

    3. JDK1.7之后一个catch块可以处理多个异常

    try {
        // ...
    } catch(SQLException | RuntimeException e) {
        conn.rollback();
        throw e;
    }
    2022-10-26 23:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有