spring事务不生效

问题描述

遇到了一个spring配置事务不能生效的问题,在网上查了一下各种解决方案,但还是不能解决,不知道问题根源在哪里,请各位大神指点,非常感谢。<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"><property name="driver">......<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource"><ref bean="dataSource" /></property><property name="packagesToScan"><list><value>com.abc</value></list></property>......<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory" ref="mySessionFactory"></property></bean><bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><ref local="mySessionFactory" /></property></bean><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" /><tx:method name="*" read-only="true" propagation="REQUIRED" /></tx:attributes></tx:advice><aop:config><aop:pointcut id="serviceMethod" expression="execution(* com.abc.*.service.*.*(..))" /><aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" /></aop:config>不知道是不是配置的问题,代码采用的是springMVC+spring+hibernate的框架,采用的是注解方式,service和DAO中都使用过注解定义事务,仍然没有作用,数据操作采用的是getHibernateTemplate().save...。 问题补充:java.lang.RuntimeException: 测试 at com.abc.forum.service.impl.TopicServiceImpl.save(TopicServiceImpl.java:25) at com.abc.forum.controller.TopicsController.addTopic(TopicsController.java:124) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)错误栈中都没有相关事务的类。

解决方案

事务生效的本质在于注解或者AOP的事务控制逻辑与代码中使用的逻辑在执行的过程中是否使用了相同的数据库连接&线程的控制,因此事务不能正确启用可能有如下几种原因:1)事务逻辑控制与代码使用的是不同的数据源:比如注解配置的是transactionManagerA ==> A的数据源,代码里面从数据源B获取连接,这时事务是不会启用的;2)使用了同一个数据源,但是使用的不是同一个连接:如使用了dataSource.getConnection直接获取连接,就不会启用事务,需要使用Spring-hibernate的框架提供的方式操作数据库;3)线程问题:AOP控制与逻辑代码获取连接实际上是通过ThreadLocal的方式共享链接的,失去了这个条件(比如你的代码里面New thread了),也是不会共享连接的。题主需要从Spring事务的原理出发,才能知道是为什么。
解决方案二:
1、在save方法后面加上REQUIRED2、在service实现类throw new RuntimeException()
解决方案三:
检查数据库是否支持事务,如果用的是MySQL,默认不支持事务。
解决方案四:
注解方式的事务不是这么配置的,<tx:annotation-driven transaction-manager="transactionManager"/>

时间: 2024-10-26 23:04:02

spring事务不生效的相关文章

spring+mybatis事务不生效,求解

问题描述 spring+mybatis事务不生效,求解 首先是applicationContext.xml文件 <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.Dat

spring事务管理的一些注意点

总结一些自己最近在使用spring事务管理时碰到的一些注意点   一.关于目标对象内部方法自我调用时的一些情形和存在的问题 1.情形1:只给b方法上加事务注解,a方法上不加 目标类的接口和实现代码示例: public interface AService {     public void a();     public void b(); }   @Service() public class AServiceImpl implements AService{     public void

mysql 回滚-spring3+mybatis+myql事务不生效

问题描述 spring3+mybatis+myql事务不生效 代码格式为 @Transactional(rollbackFor=java.lang.Exception.class, propagation=Propagation.REQUIRED, readOnly=false) public void excuDevOrAppPagRel(DevPackageRln devPackageRln) throws Exception{ //具体操作,无try-catch操作 } mysql所有表的

Spring事务讲解示例(转)

  Spring 事务Transaction1.事务的属性1.1 事务隔离IsolationLevel1.2 事务传播PropagationBehavior1.3 事务超时Timeout1.4 只读状态ReadOnly隔离级别.超时.只读状态都依赖于底层的数据库实现,Spring仅仅起了代理作用(MySQL的MyISAM引擎是无事务引擎,那么Spring是不可能带有事务管理功能的).事务传播行为是Spring框架所特有的.2 使用Spring事务只需要了解PlatformTransactionM

详解Spring事务Transaction配置的五种注入方式

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,

Spring事务管理高级应用难点剖析: 第3部分

概述 对于应用开发者来说,数据连接泄漏无疑是一个可怕的梦魇.如果存在数据连 接泄漏问题,应用程序将因数据连接资源的耗尽而崩溃,甚至还可能引起数据库的崩溃.数据 连接泄漏像黑洞一样让开发者避之唯恐不及. Spring DAO 对所有支持的数据访问技术 框架都使用模板化技术进行了薄层的封装.只要您的程序都使用 Spring DAO 模板(如 JdbcTemplate.HibernateTemplate 等)进行数据访问,一定不会存在数据连接泄漏的问题 ― ― 这是 Spring 给予我们郑重的承诺!

Spring事务管理高级应用难点剖析: 第2部分

联合军种作战的混乱 Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特 色,各有千秋.像 Hibernate 是非常优秀的 ORM 实现方案,但对底层 SQL 的控制不太方便: 而 iBatis 则通过模板化技术让您方便地控制 SQL,但没有 Hibernate 那样高的开发效率:自 由度最高的当然是直接使用 Spring JDBC 莫属了,但是它也是最底层的,灵活的代价是代码的 繁复.很难说哪种数据访问技术是最优秀的,只有在某种特定的场景下,才能给出答案.所以 在一个应用中,往

Spring事务管理高级应用难点剖析,第1部分

概述 Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了 重量级 EJB 容器的覆灭.Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来 ,专注于业务逻辑的开发上,这是一件可以被拿来顶礼膜拜的事情.但是,世界并未从此消停 ,开发人员需要面对的是层出不穷的应用场景,这些场景往往逾越了普通 Spring 技术书籍的 理想界定.因此,随着应用开发的深入,在使用经过 Spring 层层封装的声明式事务时,开发 人员越来越觉得自己坠入了迷雾,陷入了沼泽,

Spring事务配置的五种方式

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,