spring配置事务要注意的问题

在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,bean,框架,xml,jdbc)