Có, bạn có thể sử dụng trình quản lý giao dịch tuân thủ JTA như Atomikos hoặc Bitronix. Các trang web tương ứng của họ có tài liệu về cách cấu hình chúng với Spring. Nói chung, bạn sẽ phải làm theo các bước dưới đây (nếu sử dụng Atomikos):
- Giữ lại nguồn dữ liệu XA hiện có của bạn (
rtsDatasource
trong trường hợp của bạn) hoặc tạo một nguồn dữ liệu nếu chưa sử dụng (ví dụ:nếu ai đó có nguồn dữ liệu không phải XA, trước tiên nguồn dữ liệu đó phải được chuyển đổi thành nguồn dữ liệu XA). - Bao bọc nguồn dữ liệu XA trong một
AtomikosDataSourceBean
. - Trỏ
EntityManagerFactory
của bạn tạiAtomikosDataSourceBean
mới ví dụ. - Khai báo một người quản lý giao dịch XA và một giao dịch người dùng XA.
- Bao bọc trình quản lý giao dịch XA trong một Spring
JtaTransactionManager
. - Sử dụng Spring
JtaTransactionManager
.
Đoạn mã cấu hình ngắn sử dụng cơ sở dữ liệu H2, Hibernate 4, Spring 4 và Atomikos 4 được hiển thị bên dưới.
<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"/>
Để biết chi tiết, bạn có thể xem ứng dụng này .