java - JDBC Connection 的 rollback 方法在哪里调用?
阿神
阿神 2017-04-18 10:20:24
[Java讨论组]

不带事务的代码是这样的(外层的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)
ringa_lee
  1. Exception无法捕获RuntimeException的吗?

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

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

try {
    // ...
} catch(SQLException | RuntimeException e) {
    conn.rollback();
    throw e;
}
高洛峰
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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号