Spring+MyBatis+Atomikos实现JTA分布式事务
?
????? 项目中需要同时操作两个数据库,对两个数据库中的表同时做变更时就需要控制事务,要么全部成功,要么全部失败。
?
????? Atomikos是一个开源的事务管理器,研究了一下,可以满足需求。
?
????? 理解分布式事务JTA原理参见:http://www.ibm.com/developerworks/cn/java/j-lo-jta/
?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <description>springJTA</description> <context:annotation-config /> <!-- DAO scan --> <context:component-scan base-package="atomikos.demo.dao.impl" /> <context:component-scan base-package="atomikos.demo.service.impl" /> <!-- 1.指定Spring配置中用到的属性文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:spring/dataSource.properties</value> </list> </property> </bean> <!-- 2.配置数据源 --> <bean id="dataSourceScott" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="${scott.uniqueResourceName}"/> <property name="xaDataSourceClassName" value="${jdbc.driver}"/> <property name="xaProperties"> <props> <prop key="url">${scott.url}</prop> <prop key="user">${scott.username}</prop> <prop key="password">${scott.password}</prop> </props> </property> <property name="minPoolSize" value="${scott.minPoolSize}" /> <property name="maxPoolSize" value="${scott.maxPoolSize}" /> <property name="borrowConnectionTimeout" value="${scott.borrowConnectionTimeout}" /> <property name="testQuery" value="${scott.testQuery}" /> <property name="maintenanceInterval" value="${scott.maintenanceInterval}" /> </bean> <bean id="dataSourceTest" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="${test.uniqueResourceName}"/> <property name="xaDataSourceClassName" value="${jdbc.driver}"/> <property name="xaProperties"> <props> <prop key="url">${test.url}</prop> <prop key="user">${test.username}</prop> <prop key="password">${test.password}</prop> </props> </property> <property name="minPoolSize" value="${test.minPoolSize}" /> <property name="maxPoolSize" value="${test.maxPoolSize}" /> <property name="borrowConnectionTimeout" value="${test.borrowConnectionTimeout}" /> <property name="testQuery" value="${test.testQuery}" /> <property name="maintenanceInterval" value="${test.maintenanceInterval}" /> </bean> <!-- 3.sqlsessionFactory --> <bean id="scottSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation"> <value>classpath:mybatis/atomikos_demo_scottdb_mybatis-config.xml</value> </property> <property name="dataSource"> <ref bean="dataSourceScott" /> </property> </bean> <bean id="scottSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"> <constructor-arg ref="scottSqlSessionFactory" /> </bean> <bean id="testSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="mapperLocations" value="classpath*:mybatis/base/mapper-atomikos*.xml" /> <property name="dataSource"> <ref bean="dataSourceTest" /> </property> </bean> <bean id="testSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"> <constructor-arg ref="testSqlSessionFactory" /> </bean> <!-- 4.事务管理器配置 --> <!-- 分布式事务 --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="true"/> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="${transaction.timeout}"/> </bean> <!-- JTA事务管理器 --> <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager"/> <property name="userTransaction" ref="atomikosUserTransaction"/> </bean> <!-- 基于注解的声明式事务 --> <tx:annotation-driven transaction-manager="springTransactionManager" /> </beans>
?
?
?
Spring+MyBatis+Atomikos实现JTA分布式事务
原文:http://injavawetrust.iteye.com/blog/2308552