`
蔡华江
  • 浏览: 106157 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring配置事务要注意的问题

    博客分类:
  • JAVA
阅读更多

在spring框架中,开启JTA事务很简单,通常将jotm中的coral.properties复制到源目录下,再在applicationContext.xml中配置,以下是网上常见的写法:

	<context:property-placeholder location="classpath:jdbc.properties" />

	<bean id="jotm"
		class="org.springframework.transaction.jta.JotmFactoryBean" />
	<bean id="dataSource_Standard"
		class="org.enhydra.jdbc.standard.StandardXADataSource"
		destroy-method="shutdown" p:transactionManager-ref="jotm"
		p:driverName="${jdbc.driverClassName}" p:url="${jdbc.url}" />
	<bean id="dataSource"
		class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
		destroy-method="shutdown" p:user="${jdbc.username}"
		p:password="${jdbc.password}" p:dataSource-ref="dataSource_Standard" />

 但是,仅仅使用该写法会带来一个问题,就是事务默认是autocommit的,那么带来的后果是spring中配置时Propagation.NOT_SUPPORTED等选项配置都是无效的,系统无论在任何时候,总是会默认提交事务。可以使用下面的配置解决这一问题:

	<context:property-placeholder location="classpath:jdbc.properties" />

	<bean id="jotm"
		class="org.springframework.transaction.jta.JotmFactoryBean" />
	<bean id="dataSource_Standard"
		class="org.enhydra.jdbc.standard.StandardXADataSource"
		destroy-method="shutdown" p:transactionManager-ref="jotm"
		p:driverName="${jdbc.driverClassName}" p:url="${jdbc.url}" />
	<bean id="targetDataSource"
		class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
		destroy-method="shutdown" p:user="${jdbc.username}"
		p:password="${jdbc.password}" p:dataSource-ref="dataSource_Standard" />

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
		<property name="targetDataSource" ref="targetDataSource"></property>
		<property name="defaultAutoCommit" value="false"></property>
	</bean>

 经过测试,通常spring配置的所有数据源中都是自动进行事务提交的,而dhcp、c3p0等数据池会自带有defaultAutoCommit属性可以配置,而spring自带数据池BasicDataSource和jotm带的xapool数据池都是无法配置的,这个时候可以使用LazyConnectionDataSouceProxy来控制事务的自动提交。

分享到:
评论
6 楼 蔡华江 2010-01-11  
@Transactional(rollbackfor=Exception.class)才可以捕获RuntimeException,否则业务是不会回滚的。
不过我想,你可以错误的原因不在这里吧,也许是别的原因。我以前出现过这种情况,是通过在业务逻辑里手动拿Connection测试,并查看事务的debug提示中显示已打开事务。最后才发现自动提交的问题。
如果你手动打开连接,并不开启事务的情况下,业务逻辑也正常提交的话,就有可能是自动提交的问题了。
5 楼 gtman 2010-01-11  
我看业务层方法是正确的,,而测试用的方法是错的,因为测试方法是没有捕获runtimeexception异常的。
蔡华江 (架构师) 2010-01-11
===============================
首先,感谢回复!小生愚钝,你的回复我没有看懂
我的业务测试代码是这样写的:
1.@Transactional  
2.    public void TestTrans() throws RuntimeException{   
3.        Person vo=null;   
4.        Products pvo = null;   
5.        try{   
6.        vo = commonDbService.queryDataById(Person.class, null, null, "101",null);   
7.        vo.setName("aaa");   
8.        pvo = commonDbService.queryDataById(Products.class, null, null, 1, null);   
9.           
10.        pvo.setProductname("jackjackjackjackjackjackjackjackjackjackjackjackjackjackjackjackjackjack");//这里引发异常   
11.        commonDbService.updateDataById(vo); // 他居然提交了,没有回滚   
12.        commonDbService.updateDataById(pvo);   
13.        }catch (Exception e){   
14.            throw new RuntimeException(){};   
15.        }   
16.    } 

我测试过,不管我有没有throws Exception,或者不管抛RuntimeExeption还是Exception,都不能支持事务。。。
明天想看看Spring的源代码....今天晕死了..
4 楼 蔡华江 2010-01-11  
哦,看来不是这个问题了
3 楼 gtman 2010-01-11  
不好意思,刚才看错了。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/testdb?characterEncoding=GBK" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="initialSize" value="1" />
<property name="maxActive" value="50" />
<property name="minIdle" value="1" />
<property name="defaultAutoCommit" value="false"/>
</bean>
但使用上面的配置,do1也是提交了,看来不是这个问题...
2 楼 蔡华江 2010-01-11  
不是autoCommitOnClose而是defaultAutoCommit
1 楼 gtman 2010-01-11  
我用c3p0的autoCommitOnClose=false
在业务方法中
do1
do2//exception
do1居然也提交....

相关推荐

    SHH框架配置+Spring事务

    有详细步骤的SSH配置信息、Spring事务、配置时注意的关键问题及处理

    Spring的学习笔记

    一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...

    高级开发spring面试题和答案.pdf

    事务注意事项; 为什么同一个类A调用b方法事务,A方法一定要有事务(编码式的不用) @transaction多个数据源事务怎么指定数据源 传播特性有几种?7种; 某一个事务嵌套另一个事务的时候怎么办? REQUIRED_NEW和...

    Spring 2.0 开发参考手册

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. ...

    ssh配置文件详解配置strts,spring,hibernate

    可以看到配置文件的步骤: 1、 配置数据源 ...4、 Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes) 后面的一些普通的bean配置就不用说了

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言...

    Spring中文帮助文档

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于...

    spring chm文档

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. ...

    Spring API

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于...

    Hibernate Spring MySQL项目配置图解

    这是本人上课过程中为学生讲解hibernate、spring和mysql开发简单项目的截图汇集,大家需要先自己完成数据库以及JDBC数据源的配置,之后按照该截图的顺序就能完成一个最简单的支持数据库事务处理的SH系统,(如果使用...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。 (4) spring-context.jar  这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ...

    《精通Spring2.X企业应用开发详解》随书源码1-15章

    Spring MVC之一 第20章 Spring MVC之二 第21章 集成其他Web框架 第6篇 其他 第22章 Spring应用的测试 第23章 Spring工具类盘点 附录A 各种数据库连接配置及驱动 附录B IDE开发环境设置 ...

    Spring.html

    Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.无参构造 2.静态工厂 3.实例工厂 管理对象 对象关系DI 构造器注入 set注入 生命周期 scope:prototype/singleton init-...

    spring2.5 学习笔记

    一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    用springboot 集成mybatis多数据源,用aop实现的动态切换,支持事务,不会使aop动态切换失效。注意:此代码不涉及分布式事务,如果需要分布式事务 需要采取其他方案。

    Spring in Action中文版 清晰pdf part2

    你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务管理; ·与...

    Spring in Action中文版 清晰pdf part1

    你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务管理; ·与...

    《精通Spring2.X企业应用开发详解》16-19章

    Spring MVC之一 第20章 Spring MVC之二 第21章 集成其他Web框架 第6篇 其他 第22章 Spring应用的测试 第23章 Spring工具类盘点 附录A 各种数据库连接配置及驱动 附录B IDE开发环境设置 ...

    《精通Spring2.X企业应用开发详解》20-23

    Spring MVC之一 第20章 Spring MVC之二 第21章 集成其他Web框架 第6篇 其他 第22章 Spring应用的测试 第23章 Spring工具类盘点 附录A 各种数据库连接配置及驱动 附录B IDE开发环境设置 ...

Global site tag (gtag.js) - Google Analytics