`
caizi12
  • 浏览: 177774 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用spring声明式事务失效之第二弹

阅读更多
   最近又在搭一个新的开发框架,并把阿里的dubbo服务化框架集成了进来,集成ok后并配置了声明式事务,但测试结果是不会回滚。
测试代码如下
    public boolean addUser(SysUser user) throws Exception {
		dubboTestDao.addUser(user);

		SysUser sysUser = new SysUser();
		dubboTestDao.addUser(sysUser);
		
		return true;
	}

  


事务配置和之前的项目配置方法一样,执行junit测试并抛出异常,查询数据库,却查到新加了一条数据 ,事务配置如下
		<!--声明式事务控制  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<!-- 指定事务切入点  凡是实现了以cn.frame打头的包及其子包里以Service结尾接口中的所有方法需要由事务进行控制-->
	<aop:config>
		<aop:pointcut id="serviceOperation" expression="execution(* com..*Srv.*(..))" />
		<aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice" />
	</aop:config>
	 
 	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
		    <!-- 读取数据方法,一般采用只读事务-->
			<tx:method name="get*" read-only="true"/>
			<tx:method name="query*" read-only="true"/>
			<tx:method name="find*" read-only="true"/>
			<tx:method name="load*" read-only="true"/>
			
			<!--等其它增删改数据操作,当产生Exception时都进行回滚 -->
			<tx:method name="*" propagation="REQUIRED" /> 
		</tx:attributes>
	</tx:advice>

仔细看了配置,并排除了因springmvc与spring使用注解扫描同一个包导致事务失效原因后也没发现什么问题,之后不停的进行尝试,并进行修改代码,
public boolean addUser(SysUser user) throws Exception {
		dubboTestDao.addUser(user);

		SysUser sysUser = new SysUser();
		dubboTestDao.addUser(sysUser);
		if(1==1)throw new Exception();
		return true;
	}
  

依然没有回滚,后看到网上有说spring声明式事务只捕获到RuntimeException异常才能回滚事务随修改为throw new RuntimeException();事务果然能正常回滚,但为什么不添加这行代码
if(1==1)throw new Exception();
就不会回滚呢,同样都是抛出异常,唯一不一样的也就是炮出的异常类型不一样,项目中用的ibatis,由于是新new的一个对象没有设置属性就进行insert,肯定会抛异常,查看异常类型是
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
并查看了该类的父类一层一层往上查,该类最上面继承的是"SqlException>Exception",并没有继承RuntimeException,到此也就明白了问题所在,由于数据的问题抛出的异常类型是没有继承RuntimeException,因此spring也就不能正确的进行捕获并处理事务进行回滚, 这个问题看来之前没注意啊,之前给的感觉是任何异常都可以进行回滚,之前的测试类可能正好抛出的是RuntimeException类异常而没发现问题所在。

到此问题原因都知道了,那如何修改呢,有人说都抛出RuntimeException不就ok了吗,或许是一种方法,我的方法是修改配置,修改为:
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>

只要出现Exception就进行回滚。
这个问题查来查去最后只加了一个配置就解决了,解决过程有点曲折,从侧面也反映出对spring的事务管理这方面知识缺乏一定的深度及全面性。
分享到:
评论

相关推荐

    Spring源代码解析(六):Spring声明式事务处理.doc

    Spring 声明式事务处理 Spring 中的事务处理可以分为两种方式:声明式事务处理和编程式事务处理。声明式事务处理通过 AOP 的实现,把事务管理代码作为方面封装到业务代码中,使得事务管理代码和业务代码解藕。这...

    Spring声明式事务处理

    在Java中,通常使用JDBC的Connection对象来管理事务,但在Spring框架中,我们可以使用声明式事务处理来简化这一过程。 声明式事务处理的核心是基于AOP(面向切面编程)的,Spring通过在事务边界添加通知(advice)...

    Spring声明式事务

    spring声明式事务实例 可复制修改使用。。。。。。。。。。

    Spring声明式事务配置管理方法

    Spring声明式事务配置管理方法

    spring声明式事务处理demo

    Spring框架的声明式事务处理是其企业级应用中的核心特性之一,它允许开发者通过配置来管理事务,而无需在代码中显式地控制事务的开始、提交和回滚。这种方式极大地提高了代码的可读性和可维护性。在这个"spring声明...

    spring声明式事务配置

    根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...

    spring声明式事务管理配置方式

    在提供的链接中,博主可能详细解释了这些概念,并给出了实际的应用示例,包括如何配置和使用声明式事务管理。通过阅读这个博客,你可以更好地理解Spring声明式事务管理的工作原理及其在实际项目中的应用。在压缩包...

    Spring 声明式事务和Spring 编程式事务

    Spring 声明式事务和Spring 编程式事务

    spring编程式事务与声明式事务详解

    Spring 编程式事务与声明式事务详解 本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...

    Spring使用XML配置声明式事务

    这篇博文"Spring使用XML配置声明式事务"详细介绍了如何在Spring中使用XML配置来实现这一功能。 首先,我们需要了解Spring的核心组件之一——ApplicationContext,它是Spring容器的实例,负责管理和装配我们的bean。...

    使用Spring的声明式事务----AOP方式

    在Spring框架中,声明式事务管理是通过AOP(面向切面编程)实现的,它为开发者提供了方便、高效且灵活的事务管理机制。本文将深入探讨如何利用Spring的声明式事务来处理业务操作中的数据一致性问题,以及相关源码...

    spring+mybatis的声明式事务

    相比之下,声明式事务管理则更加简洁,它通过配置或注解来控制事务行为,降低了代码的耦合度。 2. **声明式事务** 标签"声明式事务"表明我们将重点讨论的是Spring的声明式事务管理。在Spring中,声明式事务主要...

    实验 spring 声明事务

    实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...

    使用Spring的声明式事务----Annotation注解方式

    在Spring框架中,声明式事务管理是其核心特性之一,它允许开发者无需手动处理事务的开始、提交、回滚等操作,而是通过配置或者注解的方式进行声明,从而简化了事务管理的复杂性。本篇文章将深入探讨如何使用Spring的...

    Spring事务管理失效原因汇总

    标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    《Spring Boot多数据源(支持Spring声明式事务切换和回滚)》 Spring Boot多数据源技术是构建高效、灵活的多租户SaaS架构的关键。在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论...

    spring声明式事务.zip

    在Spring框架中,声明式事务管理是其核心特性之一,它允许开发者通过配置或注解方式来控制事务的边界,从而极大地简化了事务管理的工作。本文将深入探讨Spring声明式事务的实现机制、优缺点以及如何在实际项目中进行...

Global site tag (gtag.js) - Google Analytics