• Spring手动回滚事务


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

    [html]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    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
      在CODE上查看代码片 派生到我的代码片
    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
      在CODE上查看代码片 派生到我的代码片
    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只捕获RuntimeExcetpion的异常,但可以通过 配置来捕获特定的异常并回滚换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new RuntimeExcetpion(),这样程序异常时才能被Aop捕获进而回滚


      解决方案: 
      方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeExcetpion()语句,以便让Aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
      方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)。


    原文链接:http://blog.csdn.net/yipanbo/article/details/46048413

    学生浅薄 望众师指点
  • 相关阅读:
    Vue生态圈之----vue-router----路由配置
    Vue生态圈之----vue-router----基础实例
    Webpack学习整理之----最简单的实例
    Webpack学习整理之----配置
    Webpack学习整理之----概念
    多个系统域名使用同一认证中心做单点登录的做法
    JavaScript基础概念之----Commonjs、CMD、AMD、UMD
    npm 镜像及使用
    nvm 指令
    mongodb安装配置启动踩的坑
  • 原文地址:https://www.cnblogs.com/Nihility/p/14695674.html
Copyright © 2020-2023  润新知