在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来控制事务的自动提交。