您的位置:首页 > 其它

异常捕获和抛出你理解的到位吗,是否你也存在这样的错误?

2015-12-30 23:31 267 查看
今天在公司运维人员反馈出现了很多数据丢失的问题.我组织开发人员进行了重现,重现之后开发人员进行修复.他们的修复方式是try
catch 一下,然后在抛出异常的地方回滚,以为修复好了就提交代码下班了.

我做代码走查时发现了问题, 这也是很多不注意细节的程序员或刚工作不久的程序员常犯的错误:

在dao层的所有方法都用了try catch 拦截,在servic层又进行了try catch 拦截,spring配置在service层控制事务.

用以下代码还原场景:


public class UserDao {
public void addUser(User user) throws SQLException{
try {
sqlMap.add("addUser",user);
}catch (SQLException e){
e.printStackTrace();
}
}

public void updateUser(User user) throws SQLException{
try {
sqlMap.add("updateUser",user);
}catch (SQLException e){
e.printStackTrace();
}
}
}
public class UserService {
UserDao userDao = new UserDao();
public void updateUser(User user) throws SQLException {
try {
//......
userDao.addUser(user);
//......
userDao.updateUser(user);
//.....
}catch (SQLException e){
e.printStackTrace();
}
}
}


spring 开启事务在service层,配置代码略.

这样的代码,如果在执行userDao.updateUser(user) 报错时,userDao.addUser(user)依然执行成功入库了.为什么呢?

答案是spring的事务配置在了UserService类的updateUser方法上,只有这个方法执行时抛出异常了才回滚事务,现在的代码"永远"都不可能把错误SQLException抛出给spring捕获,spring没有捕获到异常就会提交事务.

简单的用伪代码说明一下spring的事务处理吧:

aop spring开启事务

    try {

        执行实际方法(如上例中的updateService)

         spring 提交事务

    }catch(Exception e){

         spring 回滚事务

    }finally{

 xxxx

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: