spring事务失效情况分析

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt113

 

<!--[if !supportLists]-->一、<!--[endif]-->声明式事务和注解事务并存的情况下,事务失效。

 

该情况常见配置如下:

 

<!--事务声明-->

<bean name="transactionManager"

    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

       <property name="dataSource" ref="dataSource"></property>

    </bean>

<!--声明式事务 –->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

       <tx:attributes>

           <tx:method name="insert*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="save*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="update*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="modify*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="delete*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="find*" propagation="SUPPORTS" />

           <tx:method name="get*" propagation="SUPPORTS" />

           <tx:method name="select*" propagation="SUPPORTS" />

       </tx:attributes>

    </tx:advice>

   

    <aop:config>

       <aop:pointcut id="pc"

           expression="execution(* com.suning.sop.*.service.*(..))" />

       <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" />

    </aop:config>

 

<!—注解式事务 –->

<tx:annotation-driven

proxy-target-class="true"

transaction-manager="transactionManager"/>

 

 

 

解决方法:声明优先级,order,值越大优先级越低

将上例中,<aop:config>节点修改成如下所示

    <aop:config>

       <aop:pointcut id="pc"

           expression="execution(* com.suning.sop.*.service.*(..))" />

       <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" order="1"/>

    </aop:config>

 

<!--[if !supportLists]-->二、<!--[endif]-->ControllerService层和Dao层全部使用注解生成benaService层方法也使用注解声明事,这种情况由于 @Controller 会把 关联的@Servie自动实例化,而此时Service层中声明的事务并没有被实例化,导致事务失效。

解决方法:

 

<context:component-scan base-package="com.comtop"  use-default-filters="false" >

        <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>    

</context:component-scan>    

  

<context:component-scan base-package="com.comtop">    

        <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>    

</context:component-scan>   

Include:把@Controller关联的@Service自动实例化

exclude:屏蔽@Service自动实例化

<!--[if !supportLists]-->三、<!--[endif]-->三层都使用注解,事务也使用注解声明。事务失效

Spring 会先加载声明在xml文件中的Bean

其次是加载<context:component-scan>标签声明的包中,

声明了@Controller,@Service,@Component,@Re @Repository的类

最后是 @Transactional 标记,但上一步处理component-scan 声明的包时,类包含的@Transactional标记没有被处理,所以事务控制失效。

 

解决方法:

 

Service 层的类使用xml文件声明bean,但是事务控制仍然使用@Transactional注解来声明,事务控制才能生效

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值