`
蔡华江
  • 浏览: 107604 次
  • 性别: 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居然也提交....

相关推荐

    Spring自定义切面事务问题

    - 为了确保自定义切面中的事务能够正常工作,我们需要注意事务管理器切面与其他自定义切面之间的`order`属性设置。 - 对于一般的业务逻辑来说,将事务管理器的`order`值设置得稍微高一点(例如200),而自定义切...

    Spring事务配置的五种方式

    Spring 事务配置是Spring框架中不可或缺的部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager以及代理机制。...

    Spring Nested事务简单案例

    在Spring中,事务管理器会根据配置决定何时开始和结束事务,以及如何处理异常。当数据库表的结构与事务操作相关时,这样的脚本可以帮助我们理解数据在事务中的变化过程。 接下来,`Nested`文件可能包含了具体的Java...

    spring事务详解

    Spring的事务管理还提供了强大的事务传播行为和隔离级别配置,开发者可以根据业务需求来设置事务如何在多个方法调用之间传播,以及事务之间的隔离程度,保证数据的一致性和隔离性。 在实际应用中,Spring事务管理的...

    spring 事务基于注解模式

    通过`@Transactional`注解,我们可以轻松地控制事务的边界,设置事务属性,并结合Spring的其他模块(如Spring JDBC)进行高效的数据操作。不过,使用时需注意事务粒度的划分,避免过度使用事务导致性能瓶颈。

    Spring事务管理失效原因汇总

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

    解决osgi spring 事务配置问题

    本篇文章将详细探讨如何在OSGi环境下解决Spring事务配置问题。 首先,我们需要理解OSGi的核心概念。OSGi提供了一个运行时环境,允许开发者创建可热插拔的Java模块,称为 bundles。这些bundles可以通过服务注册和...

    关于SpringMyBatis纯注解事务不能提交的问题分析与解决

    ### 问题背景 在开发基于Spring框架的应用程序时,经常需要...此外,还需要注意事务管理器的正确配置,确保所有事务相关的组件都正确地引用了同一个数据源实例。通过上述方法,可以有效提升应用程序的可靠性和效率。

    spring 注解事务管理

    - `value`: 用于指定事务管理器的bean名称,默认值为`transactionManager`,如果不设置,Spring会自动寻找名为`transactionManager`的bean。 - `propagation`: 事务传播行为,例如`Propagation.REQUIRED`(默认值)...

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

    Spring 声明式事务管理是Spring框架中的一个重要特性,它允许开发者在不编写任何事务管理代码的情况下,通过配置来管理事务。这种方式极大地简化了事务处理,并提高了代码的可维护性。以下是关于Spring声明式事务...

    Spring事务详解

    本文将深入探讨Spring事务管理的概念、类型、配置方式以及在实际开发中的应用。 首先,我们要理解什么是事务。事务是数据库操作的基本单元,它确保一组数据库操作要么全部成功,要么全部失败。事务有四大特性,即...

    Spring事务传播机制.docx

    当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    首先,我们需要在Spring配置文件中启用事务管理器,例如使用`&lt;tx:annotation-driven&gt;`标签。这将扫描带有@Transactional注解的方法,并自动管理它们的事务边界。 ```xml &lt;!-- ... --&gt; ...

    SpringBoot事务和Spring事务详讲

    - **并发控制**:在多线程环境下,需要注意事务之间的隔离级别设置,以避免死锁或其他并发问题。 - **性能考量**:过度使用事务可能会对性能产生负面影响,因此需要合理设计事务范围。 #### 七、总结 事务管理是...

    Hibernate缓存与spring事务详解

    **标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...

    Spring事务处理-ThreadLocal的使用

    同时,也要注意ThreadLocal的内存泄漏问题,当线程结束但ThreadLocal未清除时,可能会导致内存占用过高。 总之,Spring事务处理中的ThreadLocal是保证线程安全和事务一致性的重要工具。通过深入源码学习,我们可以...

    Spring 事务 (二) Spring 声明式事务 配置

    8. **事务超时**:可以通过`timeout`属性在@Transactional注解中设置事务超时时间,超过这个时间,事务将被强制回滚。 9. **读已提交的脏数据问题**:在某些隔离级别下,可能会遇到脏读问题,即一个事务读取到另一...

    java springAOP 事务+注释

    提供的`MySpring`可能是一个自定义的Spring配置或工具类,它可能包含了设置事务管理器、扫描带有`@Transactional`注解的bean等配置。使用时,只需将`MySpring`引入到Spring应用上下文中,即可启动Spring AOP和事务...

    springAop事务配置

    本篇将详细讲解Spring AOP如何进行事务配置,包括注解和非注解两种方式。 1. **注解方式的事务管理** - **@Transactional**:这是Spring提供的核心注解,用于标记在一个方法或类上开启事务。当被注解的方法执行时...

Global site tag (gtag.js) - Google Analytics