错误情形:
程序用于转账过程中测试报错情况下,通过ConnectionUtils.getConnection()
获取到的Connection对SQL事务进行回滚操作。错误位置代码如下:
public boolean transfer(String from, String to, double money) throws Exception {
Connection connection = ConnectionUtils.getConnection();
connection.setAutoCommit(false);
try {
UserDao userDao = new UserDao();
int row1 = userDao.addMoney(to,money);
int i = 1/0; --->
int row2 = userDao.reduce(from,money);
if (row1>0 && row2>0){
connection.commit();
return true;
}
connection.rollback();
return false;
} catch (SQLException throwables) {
connection.rollback();
throwables.printStackTrace();
return false;
}
}
数据库初始状态:
进行转账测试操作:
异常情况出现,查看后台数据库变化:
发现并没出现数据回滚的情况,而是保存了转账步骤中的第一句,因此可以看出,异常捕获并没有生效,细致对比发现,异常捕获的有类型的,即catch (SQLException throwables)
,如果出现的错误不是SQLException,捕获是不会进行的,而是直接被打断结束该方法的进行
catch (SQLException throwables) {
connection.rollback();
throwables.printStackTrace();
return false;
}
解决方法
//使用捕获范围最广的Exception作为捕获对象
catch (Exception throwables) {
connection.rollback();
throwables.printStackTrace();
return false;
}