Да, можете да използвате съвместим с JTA транзакционен мениджър като Atomikos или Bitronix. Съответните им сайтове имат документация за това как да ги конфигурирате с Spring. Като цяло ще трябва да следвате стъпките, дадени по-долу (ако използвате Atomikos):
- Запазете съществуващия си източник на XA данни (
rtsDatasource
във вашия случай) или създайте такъв, ако вече не го използвате (например, ако някой има източник на данни, различен от XA, този източник на данни трябва първо да бъде преобразуван в източник на данни XA). - Обвийте източника на данни XA в
AtomikosDataSourceBean
. - Насочете вашата
EntityManagerFactory
в новияAtomikosDataSourceBean
пример. - Декларирайте XA транзакционен мениджър и XA потребителска транзакция.
- Обвийте XA транзакционния мениджър в Spring
JtaTransactionManager
. - Използвайте Spring
JtaTransactionManager
.
По-долу е показан кратък конфигурационен фрагмент, използващ H2 база данни, Hibernate 4, Spring 4 и Atomikos 4.
<bean class="org.h2.jdbcx.JdbcDataSource" id="originalDataStore" lazy-init="true">...</bean>
<bean class="com.atomikos.jdbc.AtomikosDataSourceBean" id="dataSource" init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="xaDS"/>
<property name="xaDataSource" ref="originalDataStore"/>
<property name="poolSize" value="3"/>
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.jta.platform">com.atomikos.icatch.jta.hibernate4.AtomikosPlatform</prop>
...
</props>
</property>
</bean>
<bean class="org.springframework.transaction.jta.JtaTransactionManager" id="transactionManager">
<property name="transactionManager">
<bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
<property name="forceShutdown" value="false"/>
</bean>
</property>
<property name="userTransaction">
<bean class="com.atomikos.icatch.jta.J2eeUserTransaction">
<property name="transactionTimeout" value="300"/>
</bean>
</property>
<property name="allowCustomIsolationLevels" value="true"/>
</bean>
<transaction:annotation-driven transaction-manager="transactionManager"/>
За подробности можете да видите това приложение .