在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来控制事务的自动提交。
分享到:
相关推荐
- 为了确保自定义切面中的事务能够正常工作,我们需要注意事务管理器切面与其他自定义切面之间的`order`属性设置。 - 对于一般的业务逻辑来说,将事务管理器的`order`值设置得稍微高一点(例如200),而自定义切...
Spring 事务配置是Spring框架中不可或缺的部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager以及代理机制。...
在Spring中,事务管理器会根据配置决定何时开始和结束事务,以及如何处理异常。当数据库表的结构与事务操作相关时,这样的脚本可以帮助我们理解数据在事务中的变化过程。 接下来,`Nested`文件可能包含了具体的Java...
Spring的事务管理还提供了强大的事务传播行为和隔离级别配置,开发者可以根据业务需求来设置事务如何在多个方法调用之间传播,以及事务之间的隔离程度,保证数据的一致性和隔离性。 在实际应用中,Spring事务管理的...
通过`@Transactional`注解,我们可以轻松地控制事务的边界,设置事务属性,并结合Spring的其他模块(如Spring JDBC)进行高效的数据操作。不过,使用时需注意事务粒度的划分,避免过度使用事务导致性能瓶颈。
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
本篇文章将详细探讨如何在OSGi环境下解决Spring事务配置问题。 首先,我们需要理解OSGi的核心概念。OSGi提供了一个运行时环境,允许开发者创建可热插拔的Java模块,称为 bundles。这些bundles可以通过服务注册和...
### 问题背景 在开发基于Spring框架的应用程序时,经常需要...此外,还需要注意事务管理器的正确配置,确保所有事务相关的组件都正确地引用了同一个数据源实例。通过上述方法,可以有效提升应用程序的可靠性和效率。
- `value`: 用于指定事务管理器的bean名称,默认值为`transactionManager`,如果不设置,Spring会自动寻找名为`transactionManager`的bean。 - `propagation`: 事务传播行为,例如`Propagation.REQUIRED`(默认值)...
Spring 声明式事务管理是Spring框架中的一个重要特性,它允许开发者在不编写任何事务管理代码的情况下,通过配置来管理事务。这种方式极大地简化了事务处理,并提高了代码的可维护性。以下是关于Spring声明式事务...
本文将深入探讨Spring事务管理的概念、类型、配置方式以及在实际开发中的应用。 首先,我们要理解什么是事务。事务是数据库操作的基本单元,它确保一组数据库操作要么全部成功,要么全部失败。事务有四大特性,即...
当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...
首先,我们需要在Spring配置文件中启用事务管理器,例如使用`<tx:annotation-driven>`标签。这将扫描带有@Transactional注解的方法,并自动管理它们的事务边界。 ```xml <!-- ... --> ...
- **并发控制**:在多线程环境下,需要注意事务之间的隔离级别设置,以避免死锁或其他并发问题。 - **性能考量**:过度使用事务可能会对性能产生负面影响,因此需要合理设计事务范围。 #### 七、总结 事务管理是...
**标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...
同时,也要注意ThreadLocal的内存泄漏问题,当线程结束但ThreadLocal未清除时,可能会导致内存占用过高。 总之,Spring事务处理中的ThreadLocal是保证线程安全和事务一致性的重要工具。通过深入源码学习,我们可以...
8. **事务超时**:可以通过`timeout`属性在@Transactional注解中设置事务超时时间,超过这个时间,事务将被强制回滚。 9. **读已提交的脏数据问题**:在某些隔离级别下,可能会遇到脏读问题,即一个事务读取到另一...
提供的`MySpring`可能是一个自定义的Spring配置或工具类,它可能包含了设置事务管理器、扫描带有`@Transactional`注解的bean等配置。使用时,只需将`MySpring`引入到Spring应用上下文中,即可启动Spring AOP和事务...
本篇将详细讲解Spring AOP如何进行事务配置,包括注解和非注解两种方式。 1. **注解方式的事务管理** - **@Transactional**:这是Spring提供的核心注解,用于标记在一个方法或类上开启事务。当被注解的方法执行时...