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

配置如下:

<bean id="<strong>transactionManager</strong>"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
    <aop:config>  
        <aop:pointcut id="basePointCut"  
            expression="execution(* com.xx.main.sy..service.*(..))" /><!-- execution(* com.xx..*ServiceImpl.*(..)) -->  
        <aop:advisor pointcut-ref="basePointCut" advice-ref="baseAdvice" />  
    </aop:config>  

    <tx:advice id="baseAdvice" <strong>transaction</strong>-<strong>manager</strong>="<strong>transactionManager</strong>">  
        <tx:attributes>  
            <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception,java.lang.RuntimeException" />  
            <tx:method name="*" propagation="SUPPORTS" />  
        </tx:attributes>  
    </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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值