解决Spring AOP 事务 配置 失效原因

来源:互联网 发布:软件关键技术怎么写 编辑:程序博客网 时间:2024/06/10 17:43

采用AOP配置声明式事务有5种方式,下面只说关于采用TransactionInterceptor事务拦截器的方式,配置程序如下:

transactionManager的:

XML代码  收藏代码
  1.  的id “dataSource的”  “org.apache.commons.dbcp.BasicDataSource”  破坏法“关闭”  />   
  2.   
  3. bean  id "transactionManager"  class "org.springframework.jdbc.datasource.DataSourceTransactionManager" >   
  4.     属性 “dataSource的”  参考“的dataSource”  />  
  5. </ >  

  

 的TransactionInterceptor:

 

XML代码  收藏代码
  1. bean  id "transactionInterceptor"  class "org.springframework.transaction.interceptor.TransactionInterceptor" >  
  2.     属性 “transactionManager的”  REF “transactionManager的”  />   
  3.     属性 “transactionAttributes” >   
  4.     道具>   
  5.          “添加*” PROPAGATION_REQUIRED </ 道具>   
  6.          “德尔*” PROPAGATION_REQUIRED </ 道具>  
  7.          “更新*” PROPAGATION_REQUIRED </ 道具>   
  8.          “查询*” 只读</ 道具>   
  9.          “得到*” 只读</ 道具>   
  10.          “找到*” 只读</ 道具>   
  11.          “检查*” PROPAGATION_REQUIRED </ 道具>   
  12.          “操作*” PROPAGATION_REQUIRED </ 道具>   
  13.          “批量*” PROPAGATION_REQUIRED </ 道具>   
  14.          “部署*” PROPAGATION_REQUIRED </ 道具>   
  15.          “EXEC *” PROPAGATION_REQUIRED </ 道具>   
  16.     </ 道具>   
  17.     </ 财产>   
  18. </ >   

   

自动代理的BeanNameAutoProxyCreator:

XML代码  收藏代码
  1. bean的 “org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator” >   
  2.     属性 “beanNames” >   
  3.         < - !所有以BUSImpl命名的豆-ID都会被事务拦截 - >   
  4.         * BUSImpl </ >   
  5.     </ 财产>   
  6.     属性 “interceptorNames” >   
  7.     目录>   
  8.         的TransactionInterceptor </ >  
  9.     </ 列表>   
  10. </ 财产>   
  11. </ >   

 

业务类例子:

的Java代码  收藏代码
  1. 公共  UserManageBUSImpl  实现 汇网{   
  2.     私人 UserDAO的道;   
  3.     公共 无效 的addUser(用户使用)  抛出 异常{   
  4.         dao.save(用户);   
  5.     }   
  6. }   

 

的Java代码  收藏代码
  1. 公共  UserDAO的  实现 IDAO {   
  2.     私人 的JdbcTemplate分贝;  
  3.     公共 无效的 保存(用户用户)  抛出 异常{   
  4.         db.update( “ 插入到用户(...)VALUES(...)” );   
  5.         抛出 新的 异常(“测试异常” );  / /这里我们故意抛出异常作为测试   
  6.     }   
  7. }   

   
 然后运行发现记录仍然保存进去了,事务失效;

为什么?

我们首先应该知道使用事务回滚和提交,归根结底是在JDBC里完成的,这里声明事务拦截器仅是为JDK代理切入点拦截。而做事务提交和回滚是transactionManager完成的事。那么断点跟进拦截器里程序发现:

的Java代码  收藏代码
  1. 公共 对象的invoke(最后 的MethodInvocation调用)  抛出 的Throwable {  
  2.         / /制定出目标类:可能是空的<code> </ code>的。  
  3.         / /该TransactionAttributeSource应该通过目标类  
  4.         / /,以及该方法中,这可能是从一个接口。  
  5.         类targetClass =(invocation.getThis()=!   invocation.getThis()的getClass():。  );  
  6.   
  7.         / /如果事务属性为null,则该方法是非事务性的。  
  8.         最后 TransactionAttribute txAttr =  
  9.                 getTransactionAttributeSource()getTransactionAttribute(invocation.getMethod(),targetClass);  
  10.         最终的 字符串joinpointIdentification = methodIdentification(invocation.getMethod());  
  11.   
  12.         如果 (txAttr ==   | |!(的getTransactionManager()  的instanceof  CallbackPreferringPlatformTransactionManager)){  
  13.             / /标准事务划分与getTransaction和提交/回滚调用。  
  14.             TransactionInfo txInfo = createTransactionIfNecessary(txAttr,joinpointIdentification);  
  15.             对象retVal的=  ;  
  16.             尝试 {  
  17.                 / /这是一个环绕通知:调用链中的下一个拦截器。  
  18.                 / /这通常会导致被调用的目标对象。  
  19.                 retVal的= invocation.proceed();  
  20.             }  
  21.             赶上 (Throwable的EX){  
  22.                 / /目标调用异常  
  23.                 <跨度风格= “颜色:#000000;” > completeTransactionAfterThrowing(txInfo,前); </ SPAN>  
  24.                 抛出 前;  
  25.             }  
  26.             最后 {  
  27.                 cleanupTransactionInfo(txInfo);  
  28.             }  
  29.             commitTransactionAfterReturning(txInfo);  
  30.             返回 retVal的;  
  31.         }  
  32. ......  

 
 

completeTransactionAfterThrowing(txInfo,前);这句话是异常捕获后做的事情,那么再跟进发现:

 

的Java代码  收藏代码
  1. 保护 无效 completeTransactionAfterThrowing(TransactionInfo txInfo,Throwable的EX){  
  2.     如果 (txInfo!=   && txInfo.hasTransaction()){  
  3.     如果 (logger.isDebugEnabled()){   
  4.         logger.debug( “ 完成交易,[”  + txInfo.getJoinpointIdentification()+  “]异常后:”  + EX);   
  5.     }  
  6.     <跨度风格= “颜色:#FF0000;” 如果 (txInfo.transactionAttribute.rollbackOn(前)){  / /需满足这个条件</ SPAN>   
  7.         尝试 {   
  8.             <跨度风格= “颜色:#FF0000;” 这个。transactionManager.rollback(txInfo.getTransactionStatus());  / /这里才完成JDBC的事务回滚</ SPAN>   
  9.         }  赶上 (RuntimeException的EX2){   
  10.             logger.error( “ 应用程序异常被回滚的异常被覆盖” ,前);   
  11.              EX2;   
  12.         }  赶上 (误差err){   
  13.             logger.error( “ 应用程序异常被回滚的错误被覆盖” ,前);  抛出 犯错;}   
  14.     }   
  15. ......   

  

 看来离真相越来越接近了,txInfo.transactionAttribute是什么呢?查看源码对应到一个接口TransactionAttribute,文档如下:

的Java代码  收藏代码
  1. / ** 
  2.  *这个接口增加了一个的<code> rollbackOn </ code>的规范TransactionDefinition。 
  3.  *自定义的<code> rollbackOn </ code>的只可能用AOP,这个类所在 
  4.  *在AOP交易包。 
  5.  * 
  6.  * @作者罗德约翰逊 
  7.  * @自16.03.2003 
  8.  * @见DefaultTransactionAttribute 
  9.  * @见RuleBasedTransactionAttribute 
  10.  * /  
  11. 公共 接口 TransactionAttribute  延伸 TransactionDefinition {  
  12.       
  13.     / ** 
  14.      *我们应该回滚给定的例外呢? 
  15.      * @参数前的异常评价 
  16.      * @返回是否执行回滚或不 
  17.      * /  
  18.     布尔 rollbackOn(Throwable的EX);  
  19.       
  20. }  

 

 看下RuleBasedTransactionAttribute里实现的接口方法:

 

的Java代码  收藏代码
  1. 公共 布尔 rollbackOn(Throwable的EX){   
  2.     如果 (logger.isDebugEnabled()){  
  3.         logger.debug( “ 应用规则来确定事务是否回滚应该在”  + EX);  
  4.     }   
  5.     RollbackRuleAttribute赢家=  ;   
  6.     INT  =最深返回Integer.MAX_VALUE;   
  7.     如果 (这个。rollbackRules!=  ){   
  8.         <跨度风格= “颜色:#FF0000;” / /看来这里是要满足自定义回滚规则   
  9.         对于 (迭代器it =  这个rollbackRules.iterator();。it.hasNext();) {   
  10. </ SPAN> RollbackRuleAttribute规则=(RollbackRuleAttribute)it.next();   
  11.             整型 深度= rule.getDepth(前);   
  12.             如果 (深度> =   &&深度<最深){  
  13.                 =最深深度;赢家=规则;  
  14.             }  
  15.         }   
  16.     }  
  17.      如果 (logger.isDebugEnabled()){  
  18.          logger.debug( “ 赢得回滚规则是:”  +获得者);   
  19.     }   
  20.     / /用户超类的行为(在回滚未选中),如果没有规则匹配。   
  21.     如果 (冠军==  ){   
  22.         logger.debug( “ 没有相关的回滚规则发现:运用超类的默认” );   
  23.         <跨度风格= “颜色:#FF0000;” 回报 。rollbackOn(前);  / /如果没有规则,则调用父类方法验证回滚规则</ SPAN>   
  24.     }  
  25.     返回 (赢家!  的instanceof  NoRollbackRuleAttribute);}   

   

 其父类方法为:

的Java代码  收藏代码
  1. / **  
  2. *默认行为是使用EJB:回滚的未经检查的异常。  
  3. *另外尝试回滚上的错误。  
  4. *为配合TransactionTemplate类的行为。  
  5. * /   
  6. 公共 布尔 rollbackOn(Throwable的EX){   
  7. <跨度风格= “颜色:#FF0000;” > <跨度风格= “颜色:#000000;” > </ SPAN> 回报 (当然  的instanceof  RuntimeException的| |前  的instanceof  错误);  / /最终是这个原因</ SPAN>   
  8. }   

 

原因:

由于业务类里抛出的异常不满足事务拦截器里定义的异常(RuntimeException|Error)事务回滚规则,故事务无效;

解决方案:

1,将业务类的抛出异常改为满足拦截器里的异常规则(不推荐,因为要修改以前所有的代码)

2,(推荐方案)在事务拦截器里声明自定义回滚规则,即this.rollbackRules.iterator()中有你自己申明的异常类,这个方案仅需在spring中配置如下:

XML代码  收藏代码
  1. bean  id "transactionInterceptor"  class "org.springframework.transaction.interceptor.TransactionInterceptor" >   
  2.     属性 “transactionManager的”  REF “transactionManager的”  />   
  3.     属性 “transactionAttributes” >   
  4.     道具>   
  5.          “添加*” PROPAGATION_REQUIRED,-异常</ 道具>   
  6.          “德尔*” PROPAGATION_REQUIRED,-异常</ 道具>  
  7.          “更新*” PROPAGATION_REQUIRED,-异常</ 道具>   
  8.          “查询*” 只读</ 道具>   
  9.          “得到*” 只读</ 道具>   
  10.          “找到*” 只读</ 道具>   
  11.          “检查*” PROPAGATION_REQUIRED,-异常</ 道具>   
  12.          “操作*” PROPAGATION_REQUIRED,-异常</ 道具>   
  13.          “批量*” PROPAGATION_REQUIRED,-异常</ 道具>   
  14.          “部署*” PROPAGATION_REQUIRED,-异常</ 道具>   
  15.          “EXEC *” PROPAGATION_REQUIRED,-异常</ 道具>   
  16.     </ 道具>   
  17.     </ 财产>   
  18. </ >   
  19.    

 























http://www.meile.com/ugc/3023657110849/user/274882745460    http://www.meile.com/ugc/3023657110849/user/274882745460
http://www.meile.com/ugc/3023657110813/user/274882745460    http://www.meile.com/ugc/3023657110813/user/274882745460
http://www.meile.com/ugc/3023657110778/user/274882745460    http://www.meile.com/ugc/3023657110778/user/274882745460
http://www.meile.com/ugc/3023657110748/user/274882745460    http://www.meile.com/ugc/3023657110748/user/274882745460
http://www.meile.com/ugc/3023657110695/user/274882745460    http://www.meile.com/ugc/3023657110695/user/274882745460
http://www.meile.com/ugc/3023657110655/user/274882745460    http://www.meile.com/ugc/3023657110655/user/274882745460
http://www.meile.com/ugc/3023657110616/user/274882745460    http://www.meile.com/ugc/3023657110616/user/274882745460
http://www.meile.com/ugc/3023657110578/user/274882745460    http://www.meile.com/ugc/3023657110578/user/274882745460
http://www.meile.com/ugc/3023657110556/user/274882745460    http://www.meile.com/ugc/3023657110556/user/274882745460
http://www.meile.com/ugc/3023657110522/user/274882745460    http://www.meile.com/ugc/3023657110522/user/274882745460
http://www.meile.com/ugc/3023657110485/user/274882745460    http://www.meile.com/ugc/3023657110485/user/274882745460
http://www.meile.com/ugc/3023657110444/user/274882745460    http://www.meile.com/ugc/3023657110444/user/274882745460
http://www.meile.com/ugc/3023657110407/user/274882745460    http://www.meile.com/ugc/3023657110407/user/274882745460
http://www.meile.com/ugc/3023657110364/user/274882745460    http://www.meile.com/ugc/3023657110364/user/274882745460
http://www.meile.com/ugc/3023657110323/user/274882745460    http://www.meile.com/ugc/3023657110323/user/274882745460
http://www.meile.com/ugc/3023657110280/user/274882745460    http://www.meile.com/ugc/3023657110280/user/274882745460
http://www.meile.com/ugc/3023657110243/user/274882745460    http://www.meile.com/ugc/3023657110243/user/274882745460
http://www.meile.com/ugc/3023657110210/user/274882745460    http://www.meile.com/ugc/3023657110210/user/274882745460
http://www.meile.com/ugc/3023657110176/user/274882745460    http://www.meile.com/ugc/3023657110176/user/274882745460
http://www.meile.com/ugc/3023657110128/user/274882745460    http://www.meile.com/ugc/3023657110128/user/274882745460
http://www.meile.com/ugc/3023657110071/user/274882745460    http://www.meile.com/ugc/3023657110071/user/274882745460
http://www.meile.com/ugc/3023657110025/user/274882745460    http://www.meile.com/ugc/3023657110025/user/274882745460
http://www.meile.com/ugc/3023657109982/user/274882745460    http://www.meile.com/ugc/3023657109982/user/274882745460
http://www.meile.com/ugc/3023657109933/user/274882745460    http://www.meile.com/ugc/3023657109933/user/274882745460
http://www.meile.com/ugc/3023657109881/user/274882745460    http://www.meile.com/ugc/3023657109881/user/274882745460
http://www.meile.com/ugc/3023657109830/user/274882745460    http://www.meile.com/ugc/3023657109830/user/274882745460
http://www.meile.com/ugc/3023657109790/user/274882745460    http://www.meile.com/ugc/3023657109790/user/274882745460
http://www.meile.com/ugc/3023657109746/user/274882745460    http://www.meile.com/ugc/3023657109746/user/274882745460
http://www.meile.com/ugc/3023657109492/user/274882745460    http://www.meile.com/ugc/3023657109492/user/274882745460
http://www.meile.com/ugc/3023657109463/user/274882745460    http://www.meile.com/ugc/3023657109463/user/274882745460
http://www.meile.com/ugc/3023657109432/user/274882745460    http://www.meile.com/ugc/3023657109432/user/274882745460
http://www.meile.com/ugc/3023657109394/user/274882745460    http://www.meile.com/ugc/3023657109394/user/274882745460
http://www.meile.com/ugc/3023657109355/user/274882745460    http://www.meile.com/ugc/3023657109355/user/274882745460
http://www.meile.com/ugc/3023657109327/user/274882745460    http://www.meile.com/ugc/3023657109327/user/274882745460
http://www.meile.com/ugc/3023657109296/user/274882745460    http://www.meile.com/ugc/3023657109296/user/274882745460
http://www.meile.com/ugc/3023657109265/user/274882745460    http://www.meile.com/ugc/3023657109265/user/274882745460
http://www.meile.com/ugc/3023657109238/user/274882745460    http://www.meile.com/ugc/3023657109238/user/274882745460
http://www.meile.com/ugc/3023657109211/user/274882745460    http://www.meile.com/ugc/3023657109211/user/274882745460
http://www.meile.com/ugc/3023657109185/user/274882745460    http://www.meile.com/ugc/3023657109185/user/274882745460
http://www.meile.com/ugc/3023657109141/user/274882745460    http://www.meile.com/ugc/3023657109141/user/274882745460
http://www.meile.com/ugc/3023657109090/user/274882745460    http://www.meile.com/ugc/3023657109090/user/274882745460
http://www.meile.com/ugc/3023657109045/user/274882745460    http://www.meile.com/ugc/3023657109045/user/274882745460
http://www.meile.com/ugc/3023657108991/user/274882745460    http://www.meile.com/ugc/3023657108991/user/274882745460
http://www.meile.com/ugc/3023657108945/user/274882745460    http://www.meile.com/ugc/3023657108945/user/274882745460
http://www.meile.com/ugc/3023657108899/user/274882745460    http://www.meile.com/ugc/3023657108899/user/274882745460
http://www.meile.com/ugc/3023657108844/user/274882745460    http://www.meile.com/ugc/3023657108844/user/274882745460
http://www.meile.com/ugc/3023657108791/user/274882745460    http://www.meile.com/ugc/3023657108791/user/274882745460
http://www.meile.com/ugc/3023657108729/user/274882745460    http://www.meile.com/ugc/3023657108729/user/274882745460
http://www.meile.com/ugc/3023657108667/user/274882745460    http://www.meile.com/ugc/3023657108667/user/274882745460
http://www.meile.com/ugc/3023657108608/user/274882745460    http://www.meile.com/ugc/3023657108608/user/274882745460
http://www.meile.com/ugc/3023657108552/user/274882745460    http://www.meile.com/ugc/3023657108552/user/274882745460
http://www.meile.com/ugc/3023657108496/user/274882745460    http://www.meile.com/ugc/3023657108496/user/274882745460
http://www.meile.com/ugc/3023657108467/user/274882745460    http://www.meile.com/ugc/3023657108467/user/274882745460
http://www.meile.com/ugc/3023657108441/user/274882745460    http://www.meile.com/ugc/3023657108441/user/274882745460
http://www.meile.com/ugc/3023657108399/user/274882745460    http://www.meile.com/ugc/3023657108399/user/274882745460
http://www.meile.com/ugc/3023657108365/user/274882745460    http://www.meile.com/ugc/3023657108365/user/274882745460
http://www.meile.com/ugc/3023657108324/user/274882745460    http://www.meile.com/ugc/3023657108324/user/274882745460
http://www.meile.com/ugc/3023657108283/user/274882745460    http://www.meile.com/ugc/3023657108283/user/274882745460
http://www.meile.com/ugc/3023657108246/user/274882745460    http://www.meile.com/ugc/3023657108246/user/274882745460
http://www.meile.com/ugc/3023657108213/user/274882745460    http://www.meile.com/ugc/3023657108213/user/274882745460
http://www.meile.com/ugc/3023657108166/user/274882745460    http://www.meile.com/ugc/3023657108166/user/274882745460
http://www.meile.com/ugc/3023657108108/user/274882745460    http://www.meile.com/ugc/3023657108108/user/274882745460
http://www.meile.com/ugc/3023657108040/user/274882745460    http://www.meile.com/ugc/3023657108040/user/274882745460
http://www.meile.com/ugc/3023657107986/user/274882745460    http://www.meile.com/ugc/3023657107986/user/274882745460
http://www.meile.com/ugc/3023657107928/user/274882745460    http://www.meile.com/ugc/3023657107928/user/274882745460
http://www.meile.com/ugc/3023657107871/user/274882745460    http://www.meile.com/ugc/3023657107871/user/274882745460
http://www.meile.com/ugc/3023657107804/user/274882745460    http://www.meile.com/ugc/3023657107804/user/274882745460
http://www.meile.com/ugc/3023657107761/user/274882745460    http://www.meile.com/ugc/3023657107761/user/274882745460
http://www.meile.com/ugc/3023657107740/user/274882745460    http://www.meile.com/ugc/3023657107740/user/274882745460
http://www.meile.com/ugc/3023657107708/user/274882745460    http://www.meile.com/ugc/3023657107708/user/274882745460
http://www.meile.com/ugc/3023657107652/user/274882745460    http://www.meile.com/ugc/3023657107652/user/274882745460
http://www.meile.com/ugc/3023657107619/user/274882745460    http://www.meile.com/ugc/3023657107619/user/274882745460
http://www.meile.com/ugc/3023657107563/user/274882745460    http://www.meile.com/ugc/3023657107563/user/274882745460
http://www.meile.com/ugc/3023657107490/user/274882745460    http://www.meile.com/ugc/3023657107490/user/274882745460
http://www.meile.com/ugc/3023657107414/user/274882745460    http://www.meile.com/ugc/3023657107414/user/274882745460
http://www.meile.com/ugc/3023657107336/user/274882745460    http://www.meile.com/ugc/3023657107336/user/274882745460
http://www.meile.com/ugc/3023657107270/user/274882745460    http://www.meile.com/ugc/3023657107270/user/274882745460
http://www.meile.com/ugc/3023657107199/user/274882745460    http://www.meile.com/ugc/3023657107199/user/274882745460
http://www.meile.com/ugc/3023657107133/user/274882745460    http://www.meile.com/ugc/3023657107133/user/274882745460
http://www.meile.com/ugc/3023657107087/user/274882745460    http://www.meile.com/ugc/3023657107087/user/274882745460
http://www.meile.com/ugc/3023657107006/user/274882745460    http://www.meile.com/ugc/3023657107006/user/274882745460
http://www.meile.com/ugc/3023657106942/user/274882745460    http://www.meile.com/ugc/3023657106942/user/274882745460
http://www.meile.com/ugc/3023657106823/user/274882745460    http://www.meile.com/ugc/3023657106823/user/274882745460
http://www.meile.com/ugc/3023657106297/user/274882745460    http://www.meile.com/ugc/3023657106297/user/274882745460
http://www.meile.com/ugc/3023657106201/user/274882745460    http://www.meile.com/ugc/3023657106201/user/274882745460
http://www.meile.com/ugc/3023657106147/user/274882745460    http://www.meile.com/ugc/3023657106147/user/274882745460
http://www.meile.com/ugc/3023657106125/user/274882745460    http://www.meile.com/ugc/3023657106125/user/274882745460





0 0