解决Spring AOP 事务 配置 失效原因
来源:互联网 发布:软件关键技术怎么写 编辑:程序博客网 时间:2024/06/10 17:43
采用AOP配置声明式事务有5种方式,下面只说关于采用TransactionInterceptor事务拦截器的方式,配置程序如下:
transactionManager的:
- < 豆 的id = “dataSource的” 类= “org.apache.commons.dbcp.BasicDataSource” 破坏法= “关闭” />
- < bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
- < 属性 名= “dataSource的” 参考= “的dataSource” />
- </ 豆>
的TransactionInterceptor:
- < bean id = "transactionInterceptor" class = "org.springframework.transaction.interceptor.TransactionInterceptor" >
- < 属性 名= “transactionManager的” REF = “transactionManager的” />
- < 属性 名= “transactionAttributes” >
- < 道具>
- < 托 键= “添加*” > PROPAGATION_REQUIRED </ 道具>
- < 托 键= “德尔*” > PROPAGATION_REQUIRED </ 道具>
- < 托 键= “更新*” > PROPAGATION_REQUIRED </ 道具>
- < 托 键= “查询*” > 只读</ 道具>
- < 托 键= “得到*” > 只读</ 道具>
- < 托 键= “找到*” > 只读</ 道具>
- < 托 键= “检查*” > PROPAGATION_REQUIRED </ 道具>
- < 托 键= “操作*” > PROPAGATION_REQUIRED </ 道具>
- < 托 键= “批量*” > PROPAGATION_REQUIRED </ 道具>
- < 托 键= “部署*” > PROPAGATION_REQUIRED </ 道具>
- < 托 键= “EXEC *” > PROPAGATION_REQUIRED </ 道具>
- </ 道具>
- </ 财产>
- </ 豆>
自动代理的BeanNameAutoProxyCreator:
- < bean的 类= “org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator” >
- < 属性 名= “beanNames” >
- < - !所有以BUSImpl命名的豆-ID都会被事务拦截 - >
- < 值> * BUSImpl </ 值>
- </ 财产>
- < 属性 名= “interceptorNames” >
- < 目录>
- < 值> 的TransactionInterceptor </ 值>
- </ 列表>
- </ 财产>
- </ 豆>
业务类例子:
- 公共 类 UserManageBUSImpl 实现 汇网{
- 私人 UserDAO的道;
- 公共 无效 的addUser(用户使用) 抛出 异常{
- dao.save(用户);
- }
- }
- 公共 类 UserDAO的 实现 IDAO {
- 私人 的JdbcTemplate分贝;
- 公共 无效的 保存(用户用户) 抛出 异常{
- db.update( “ 插入到用户(...)VALUES(...)” );
- 抛出 新的 异常(“测试异常” ); / /这里我们故意抛出异常作为测试
- }
- }
然后运行发现记录仍然保存进去了,事务失效;
为什么?
我们首先应该知道使用事务回滚和提交,归根结底是在JDBC里完成的,这里声明事务拦截器仅是为JDK代理切入点拦截。而做事务提交和回滚是transactionManager完成的事。那么断点跟进拦截器里程序发现:
- 公共 对象的invoke(最后 的MethodInvocation调用) 抛出 的Throwable {
- / /制定出目标类:可能是空的<code> </ code>的。
- / /该TransactionAttributeSource应该通过目标类
- / /,以及该方法中,这可能是从一个接口。
- 类targetClass =(invocation.getThis()=! 空 invocation.getThis()的getClass():。 空);
- / /如果事务属性为null,则该方法是非事务性的。
- 最后 TransactionAttribute txAttr =
- getTransactionAttributeSource()getTransactionAttribute(invocation.getMethod(),targetClass);
- 最终的 字符串joinpointIdentification = methodIdentification(invocation.getMethod());
- 如果 (txAttr == 空 | |!(的getTransactionManager() 的instanceof CallbackPreferringPlatformTransactionManager)){
- / /标准事务划分与getTransaction和提交/回滚调用。
- TransactionInfo txInfo = createTransactionIfNecessary(txAttr,joinpointIdentification);
- 对象retVal的= 空;
- 尝试 {
- / /这是一个环绕通知:调用链中的下一个拦截器。
- / /这通常会导致被调用的目标对象。
- retVal的= invocation.proceed();
- }
- 赶上 (Throwable的EX){
- / /目标调用异常
- <跨度风格= “颜色:#000000;” > completeTransactionAfterThrowing(txInfo,前); </ SPAN>
- 抛出 前;
- }
- 最后 {
- cleanupTransactionInfo(txInfo);
- }
- commitTransactionAfterReturning(txInfo);
- 返回 retVal的;
- }
- ......
completeTransactionAfterThrowing(txInfo,前);这句话是异常捕获后做的事情,那么再跟进发现:
- 保护 无效 completeTransactionAfterThrowing(TransactionInfo txInfo,Throwable的EX){
- 如果 (txInfo!= 空 && txInfo.hasTransaction()){
- 如果 (logger.isDebugEnabled()){
- logger.debug( “ 完成交易,[” + txInfo.getJoinpointIdentification()+ “]异常后:” + EX);
- }
- <跨度风格= “颜色:#FF0000;” > 如果 (txInfo.transactionAttribute.rollbackOn(前)){ / /需满足这个条件</ SPAN>
- 尝试 {
- <跨度风格= “颜色:#FF0000;” > 这个。transactionManager.rollback(txInfo.getTransactionStatus()); / /这里才完成JDBC的事务回滚</ SPAN>
- } 赶上 (RuntimeException的EX2){
- logger.error( “ 应用程序异常被回滚的异常被覆盖” ,前);
- 扔 EX2;
- } 赶上 (误差err){
- logger.error( “ 应用程序异常被回滚的错误被覆盖” ,前); 抛出 犯错;}
- }
- ......
看来离真相越来越接近了,txInfo.transactionAttribute是什么呢?查看源码对应到一个接口TransactionAttribute,文档如下:
- / **
- *这个接口增加了一个的<code> rollbackOn </ code>的规范TransactionDefinition。
- *自定义的<code> rollbackOn </ code>的只可能用AOP,这个类所在
- *在AOP交易包。
- *
- * @作者罗德约翰逊
- * @自16.03.2003
- * @见DefaultTransactionAttribute
- * @见RuleBasedTransactionAttribute
- * /
- 公共 接口 TransactionAttribute 延伸 TransactionDefinition {
- / **
- *我们应该回滚给定的例外呢?
- * @参数前的异常评价
- * @返回是否执行回滚或不
- * /
- 布尔 rollbackOn(Throwable的EX);
- }
看下RuleBasedTransactionAttribute里实现的接口方法:
- 公共 布尔 rollbackOn(Throwable的EX){
- 如果 (logger.isDebugEnabled()){
- logger.debug( “ 应用规则来确定事务是否回滚应该在” + EX);
- }
- RollbackRuleAttribute赢家= 空;
- INT =最深返回Integer.MAX_VALUE;
- 如果 (这个。rollbackRules!= 空){
- <跨度风格= “颜色:#FF0000;” > / /看来这里是要满足自定义回滚规则
- 对于 (迭代器it = 这个rollbackRules.iterator();。it.hasNext();) {
- </ SPAN> RollbackRuleAttribute规则=(RollbackRuleAttribute)it.next();
- 整型 深度= rule.getDepth(前);
- 如果 (深度> = 0 &&深度<最深){
- =最深深度;赢家=规则;
- }
- }
- }
- 如果 (logger.isDebugEnabled()){
- logger.debug( “ 赢得回滚规则是:” +获得者);
- }
- / /用户超类的行为(在回滚未选中),如果没有规则匹配。
- 如果 (冠军== 空){
- logger.debug( “ 没有相关的回滚规则发现:运用超类的默认” );
- <跨度风格= “颜色:#FF0000;” > 回报 超。rollbackOn(前); / /如果没有规则,则调用父类方法验证回滚规则</ SPAN>
- }
- 返回 (赢家! 的instanceof NoRollbackRuleAttribute);}
其父类方法为:
- / **
- *默认行为是使用EJB:回滚的未经检查的异常。
- *另外尝试回滚上的错误。
- *为配合TransactionTemplate类的行为。
- * /
- 公共 布尔 rollbackOn(Throwable的EX){
- <跨度风格= “颜色:#FF0000;” > <跨度风格= “颜色:#000000;” > </ SPAN> 回报 (当然 的instanceof RuntimeException的| |前 的instanceof 错误); / /最终是这个原因</ SPAN>
- }
原因:
由于业务类里抛出的异常不满足事务拦截器里定义的异常(RuntimeException|Error)事务回滚规则,故事务无效;
解决方案:
1,将业务类的抛出异常改为满足拦截器里的异常规则(不推荐,因为要修改以前所有的代码)
2,(推荐方案)在事务拦截器里声明自定义回滚规则,即this.rollbackRules.iterator()中有你自己申明的异常类,这个方案仅需在spring中配置如下:
- < bean id = "transactionInterceptor" class = "org.springframework.transaction.interceptor.TransactionInterceptor" >
- < 属性 名= “transactionManager的” REF = “transactionManager的” />
- < 属性 名= “transactionAttributes” >
- < 道具>
- < 托 键= “添加*” > PROPAGATION_REQUIRED,-异常</ 道具>
- < 托 键= “德尔*” > PROPAGATION_REQUIRED,-异常</ 道具>
- < 托 键= “更新*” > PROPAGATION_REQUIRED,-异常</ 道具>
- < 托 键= “查询*” > 只读</ 道具>
- < 托 键= “得到*” > 只读</ 道具>
- < 托 键= “找到*” > 只读</ 道具>
- < 托 键= “检查*” > PROPAGATION_REQUIRED,-异常</ 道具>
- < 托 键= “操作*” > PROPAGATION_REQUIRED,-异常</ 道具>
- < 托 键= “批量*” > PROPAGATION_REQUIRED,-异常</ 道具>
- < 托 键= “部署*” > PROPAGATION_REQUIRED,-异常</ 道具>
- < 托 键= “EXEC *” > PROPAGATION_REQUIRED,-异常</ 道具>
- </ 道具>
- </ 财产>
- </ 豆>
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
- 解决Spring AOP 事务 配置 失效原因
- 解决Spring AOP 事务 配置 失效原因--业务类里抛出的异常不满足事务拦截器里定义的异常
- spring AOP 拦截器方式配置事务失效
- Spring事务失效的原因
- Spring事务失效的原因
- spring 事务失效的原因
- Spring事务失效的原因
- AOP配置通知失效原因
- Spring AOP事务配置
- spring aop 事务配置
- spring aop 事务配置
- spring AOP 事务配置
- Spring aop事务配置
- spring+springmvc aop失效的原因
- spring的aop事务配置
- spring 事务 aop:pointcut配置
- spring aop事务 propagation配置
- spring aop与事务配置
- 创建一个JFrame对象
- struts2--(3)一些小知识点
- SD卡中的ACMD命令(the application specific commands)
- oracle事务槽(二)
- JS根据userAgent值来判断浏览器的类型及版本
- 解决Spring AOP 事务 配置 失效原因
- Android 实用工具Hierarchy Viewer实战
- Python实现Windows监控agent(上)
- PyMongo基本使用
- 结束
- 高手对中科院考博英语的体会
- oracle往表里导入数据
- 没变强是因为你太舒服(图)
- mysql笔记-- mysql命令札记7 数据类型