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

原因: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 的话,事务会回滚。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值