在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来控制事务的自动提交。
本文介绍如何在Spring框架中正确配置JTA事务管理器,并解决默认自动提交的问题。通过使用LazyConnectionDataSourceProxy来控制事务自动提交,确保了Propagation.NOT_SUPPORTED等配置的有效性。
173万+

被折叠的 条评论
为什么被折叠?



