异常捕获和抛出你理解的到位吗,是否你也存在这样的错误?
2015-12-30 23:31
267 查看
今天在公司运维人员反馈出现了很多数据丢失的问题.我组织开发人员进行了重现,重现之后开发人员进行修复.他们的修复方式是try
catch 一下,然后在抛出异常的地方回滚,以为修复好了就提交代码下班了.
我做代码走查时发现了问题, 这也是很多不注意细节的程序员或刚工作不久的程序员常犯的错误:
在dao层的所有方法都用了try catch 拦截,在servic层又进行了try catch 拦截,spring配置在service层控制事务.
用以下代码还原场景:
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
}
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
}
相关文章推荐
- Android中解决动画的频繁出现
- USB设备架构
- runtime自动归档/解档
- VaterFreunden 的地址
- 插入排序
- 第六届河南省赛 zzulioj 1484: 探 寻 宝 藏 (二维双线DP)nyoj 712
- Slides for RxJava,Android,FRP
- 抽象工厂模式
- Java枚举类型的小应用
- Android Studio快捷键每日一练(1)
- LeetCode 116:Populating Next Right Pointers in Each Node
- Spring MVC集成Tiles使用方法
- 第六届河南省赛 zzulioj 1481: 异 形 卵 (DP)水 nyoj 709
- 年末总结,新年计划
- Jquery发送ajax请求以及datatype参数为text/JSON方式
- 在SQL语句中使用正则表达式
- 猿题库 iOS 客户端架构设计
- 如何用shell脚本监控服务器负载、cpu、内存、硬盘和登录用户数
- 点击tablecell中的一个按钮,确定cell所在的行
- Spark MLlib1.51功能一览