Spring事务异常回滚,捕获异常不抛出就不会回滚

来源:互联网 发布:什么是电子商务数据库 编辑:程序博客网 时间:2024/05/17 17:42

最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......  
  为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志。但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚。

  例:  
   类似这样的方法不会回滚 (一个方法出错,另一个方法不会回滚) :  

[html] view plain copy
  1. if(userSave){          
  2.     try {         
  3.         userDao.save(user);          
  4.         userCapabilityQuotaDao.save(capabilityQuota);         
  5.      } catch (Exception e) {          
  6.         logger.info("能力开通接口,开户异常,异常信息:"+e);         
  7.      }         
  8.  }  

下面的方法回滚(一个方法出错,另一个方法会回滚):

[html] view plain copy
  1. if(userSave){         
  2.      try {          
  3.         userDao.save(user);          
  4.         userCapabilityQuotaDao.save(capabilityQuota);         
  5.        } catch (Exception e) {         
  6.         logger.info("能力开通接口,开户异常,异常信息:"+e);          
  7.         throw new RuntimeException();         
  8.      }          
  9. }  
或者:
[html] view plain copy
  1. if(userSave){          
  2.     try {          
  3.         userDao.save(user);          
  4.         userCapabilityQuotaDao.save(capabilityQuota);          
  5.     } catch (Exception e) {          
  6.         logger.info("能力开通接口,开户异常,异常信息:"+e);          
  7.         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();         
  8.     }         
  9.  }  

为什么不会滚呢??是对Spring的事务机制就不明白。!! 
   默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。  
   spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过  
    
配置来捕获特定的异常并回滚  
  换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚
  解决方案: 
  方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
  方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孙悟空说过的八句狠话 激励自己减肥的狠话 励志图片带字霸气狠话 骂小偷不带脏字的狠话 骂婆婆不带脏字的狠话 骂前任不带脏字的狠话 100句骂醒自己的狠话 送给不懂尊重人的狠话 送给pk对手的一句狠话 骂小三不带脏字的狠话 骂脸皮厚人不带脏字的狠话 狡兔三穴 狡兔死 狡兔 狡兔偷吃窝边草 米璐璐 狡猾 狡猾的意思 狡猾狐狸 狡猾家丁 狡猾的爱 狡猾天狗 狡猾近义词 狡猾拼音 狡猾的拼音 狡猾的老鼠 狡猾的反义词 狡猾的近义词 狡猾的狐狸歌词 狡猾的狐狸故事 狡猾的动物猜一生肖 形容狡猾的成语 狡猾的动物打一生肖 狡猾的狐狸作文 狡猾的近义词是什么 欲钱买狡猾无比的动物 狡猾的反义词是什么 狡猾的狐狸童话故事 做一只狡猾的狐狸歌词 婚情袭人我的狡猾小老婆 养狐为妃神帝太狡猾