Sping boot try catch语句后 @Transactional事务不回滚(已解决)

本文探讨了在Spring中,当trycatch语句捕获异常导致@Transactional无法自动回滚事务的问题。解决方案包括在@Transactional注解中指定rollbackFor=Exception.class,以及在catch块中手动设置事务回滚。同时,文章解释了Spring事务的生命周期,强调了未捕获的RuntimeException对事务的影响。

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

原因:try catch语句会捕获你发出的异常 @Transactional感知不到抛出的异常 自然也就不会进行事物回滚

解决:

1.使用以下配置(基础的  Transactional配置只能拦截RuntimeException和Error异常)

@Transactional(rollbackFor = Exception.class)

2.catch中添加(手动进行回滚)

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//回滚

完整代码

    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody XdnCompany xdnCompany) {
        try {
               //方法1
               //方法2
            return 
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//回滚
            return error("出错了,请刷新后重试");
        }

    }

当 B 中抛出了一个异常以后,B 标识当前事务需要 rollback。但是由于 A 手动捕获该异常并进行处理,A 认为当前事务应该正常 commit。此时就出现了前后不一致,也就是因为这样,抛出了前面的UnexpectedRollbackException

Spring 的事务是在调用业务方法之前开始的,业务方法执行完毕之后才执行 commit/rollback,事务是否执行取决于是否抛出 RuntimeException。如果抛出 RuntimeException,并在业务方法中没有 catch 的话,事务会回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值