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

本文通过一个具体案例揭示了在使用Spring框架进行事务管理时常见的错误做法:即在DAO层和服务层同时使用try...catch来捕获异常,导致部分操作执行成功而无法触发Spring的事务回滚机制,最终造成数据不一致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在公司运维人员反馈出现了很多数据丢失的问题.我组织开发人员进行了重现,重现之后开发人员进行修复.他们的修复方式是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
    }
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值