springAOP事物管理不生效原因总结

配置如下:

[html]  view plain  copy
  1. <bean id="<strong>transactionManager</strong>"  
  2.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  3.         <property name="dataSource" ref="dataSource" />  
  4.     </bean>  
  5.     <aop:config>  
  6.         <aop:pointcut id="basePointCut"  
  7.             expression="execution(* com.xx.main.sy..service.*(..))" /><!-- execution(* com.xx..*ServiceImpl.*(..)) -->  
  8.         <aop:advisor pointcut-ref="basePointCut" advice-ref="baseAdvice" />  
  9.     </aop:config>  
  10.       
  11.     <tx:advice id="baseAdvice" <strong>transaction</strong>-<strong>manager</strong>="<strong>transactionManager</strong>">  
  12.         <tx:attributes>  
  13.             <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception,java.lang.RuntimeException" />  
  14.             <tx:method name="*" propagation="SUPPORTS" />  
  15.         </tx:attributes>  
  16.     </tx:advice>  

配置方式很多,具体大家可以去网上查找,此处就不赘述了,这里之说下可能造成事物失效的原因:

前提是你的事物配置不会出现基本的错误,如excution表达式的错误,导致不能正确的注入事物,以及advice中指定注册的事物管理bean等

一:想必大家都用了springMVC,并且使用了其扫描器组件,对项目中加入servcie /ctroller注解的bean进行注册交给srping容器管理,在springMVC配置文件中我们只扫描ctroller对所有的service进行过滤掉,因为按照spring配置文件的加载顺序来讲,先加载springmvc配置文件,再加载spring配置文件,我们的事物一般都在srping配置文件中进行配置,如果此时在加载srpingMVC配置文件的时候,把servlce也给注册了,但是此时事物还没加载,也就导致后面的事物无法成功注入到service中。所以把对service的扫描放在spring配置文件中或是其他配置文件中。(aop失效的原因如下
1、在主容器中(applicationContext.xml),将Controller的注解排除掉 
<context:component-scan base-package="com"> 
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
</context:component-scan> 

2、而在springMVC配置文件中将Service注解给去掉 
<context:component-scan base-package="com"> 
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> 
  </context:component-scan> 

因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容 器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以 保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。 

还有一种方式是将service层改用xml配置,其实这样做也是变相的让springmvc无法扫描service,而只能依赖父窗口也就是ServletContextListener来进行初始化,这样同样被赋予了事务性。 

二:如果以上步骤都没问题,事物还是失效,查看事物配置中的excution表达式路径是否正确,查看rollback-for指定的异常类是否有,通过Log4j ,debug模式将事物日志打印出来,在方法中手动new一个异常抛出(throw new RuntimeException())看是否事物回滚了,注意异常抛出要在service层

三:如果你用了mysql数据库,查看数据库存储引擎,MyISAM是不支持事物的,需要改成InnoDB

四:看拦截的异常,业务的异常是否也进行了拦截,参看上一篇spring aop失效文章中的详解


转载地址:http://blog.csdn.net/superdog007/article/details/50315319

http://blog.csdn.net/gjb724332682/article/details/41313071

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值