spring事物管理,异常回滚,如果使用try catch进行捕获不抛出,事物不回滚

32 篇文章 0 订阅
11 篇文章 0 订阅

1.在今天测试代码的正确性,遇到了事物不进行回滚操作.

例子:(伪代码)

当第二个insert的时候,第一个方法没有进行回滚.(查询数据库,数据表有产品信息)  

2.查询解答:

默认情况下spring事务只在发生未被捕获的 RuntimeException时才回滚(运行时异常)

try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获并“吞掉”,导致spring异常抛出触发事务回滚策略失效。

3.最终解决方案:

解决方案1:

 try {        
        spuDao.save(spuEntity);        
        skuDao.save(skuEntity);       
       } catch (Exception e) {       
          throw new RuntimeException();       
     }  

解决方案2:

try {

        spuDao.save(spuEntity);        
        skuDao.save(skuEntity);       

} catch (Exception e) {

     logger.info("保存接口出错:"+e);

      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

}

配置来捕获特定的异常并回滚  
  (1)在service方法中不使用try catch,当代码运行在第二句保存时,会抛出运行时异常,这时候就会进行回滚                                       

(2)在catch中最后加上throw new RuntimeException(),这样程序异常才能被aop捕获进而回滚
  解决方案: 
  方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(controller)要继续捕获这个异常并处理 (现在项目的做法)
  方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值