1. 在pom文件引入atomikos依赖
用maven要简单一点,只需要加入两个依赖:
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions-jdbc</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
2. 将需要分布式事务的数据源变成AtomikosDataSourceBean
3. 使用数据源
这一步与平时好像没什么不一样。我做例子的时候是用mybatis,配置如下:
<bean id="oracleJta" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" lazy-init="true">
<property name="uniqueResourceName">
<value>OracleXADataSource</value><!-- 任意命名,但必须唯一 -->
</property>
<property name="xaDataSourceClassName">
<value>oracle.jdbc.xa.client.OracleXADataSource</value>
</property>
<property name="xaProperties">
<props>
<prop key="URL">jdbc:oracle:thin:@localhost:1521:orcl</prop>
<prop key="user">orcl</prop>
<prop key="password"></prop>
</props>
</property>
<property name="poolSize"><value>1</value></property>
<property name="maxPoolSize"><value>30</value></property>
</bean>
3. 使用数据源
这一步与平时好像没什么不一样。我做例子的时候是用mybatis,配置如下:
<bean id="jdbcTemplateA" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="oracleJta"/>
</bean>
动态数据源动态切换 经过试验无法与atomikos分布式事务兼容,不会切数据源,只能更新第一个数据源
4. 将trasactionmanager变为Atomikos事务方法
<bean id="atomikosTransactionManager"
class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown">
<value>true</value>
</property>
</bean>
<bean id="atomikosUserTransaction"
class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="240" />
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager" />
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction" />
</property>
</bean>
5.<tx:annotation-driven transaction-manager="txManager"/>
将注解的tx:annotation-driven transaction-manager改为JTA对应的transactionManager的id
将注解的tx:annotation-driven transaction-manager改为JTA对应的transactionManager的id
从而利用声明式事务注解@Transactional,开启JTA分布式事务
原来的单库事务还是通过拦截器实现