详见: 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]-->Controller,Service层和Dao层全部使用注解生成bena,Service层方法也使用注解声明事,这种情况由于 @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注解来声明,事务控制才能生效
相关推荐
Spring事务失效Spring事务失效
Spring声明式事务管理失效的原因,这里面是日常工作中踩过的坑,事务失效所产生的影响比较隐蔽,测试时易忽略,大多是在线上暴露,这可能是对Spring管理下的信任吧
主要介绍了Spring事务失效问题分析及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
详细整理Spring事务失效的具体场景及解决方案.docx
Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源代码解析(六):Spring声明式事务处理 Spring源代码解析(七):Spring AOP中对拦截器...
spring事务与数据库操作
Spring事务管理Demo
包含spring事务管理案例的项目源码和说明文档
Spring事务流程图时序图Spring事务流程图时序图Spring事务流程图时序图Spring事务流程图时序图
spring的核心就是IC依赖注入,那么就要先解析依赖配置,然后再注入。所以spring的功能都会出现两块,一块是解析mxl,一块是构建BeanDefinition。...事务增强器也是这样,先要解析事务的标签,然后才是执行事务。
spring事务分析spring事务分析spring事务分析
spring 事务spring 事务spring 事务spring 事务spring 事务
Spring事务原理、Spring事务配置的五种方式
spring事务配置详解 spring事务配置详解
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
spring 事务传播 demo
spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码
spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务的底层实现流程图 spring事务...
spring事务源码解析
Spring框架的事务管理应用分析.doc