解决跨库数据一致性问题通常会采用jta/xa的事务方式,下面介绍一下利用atomikos在spring3.x+hibernate3.x下的配置方式:
一、事务能解决的问题
保持ACID,也就是原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily ),分布式环境下,或者说假如有多个数据库,如果保持acid呢?
二、分布式事务
分布式事务(Distributed Transaction)包括:
- 事务管理器(Transaction Manager),事务管理器承担着所有事务参与单元的协调与控制;
- 一个或多个支持 XA 协议的资源管理器 ( Resource Manager ),我们可以将资源管理器看做任意类型的持久化数据存储。
与本地事务相比,XA 协议的系统开销大,在系统开发过程中应慎重考虑是否确实需要分布式事务。
三、atomikos+spring+hibernate配置jta事务
- 配置多个xa数据源
<bean id="dataSourceSrc1" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="mysql/master"/> <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)--> <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/> <property name="xaProperties"> <props> <prop key="URL">${db.jdbcUrl}</prop> <prop key="user">${db.user}</prop> <prop key="password">${db.password}</prop> </props> </property> <property name="poolSize" value="${db.initialPoolSize}" /> <property name="minPoolSize" value="${db.minPoolSize}" /> <property name="maxPoolSize" value="${db.maxPoolSize}" /> </bean>
<bean id="dataSourceSrc2" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="mysql/slaver"/> <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)--> <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/> <property name="xaProperties"> <props> <prop key="URL">${db.cms.jdbcUrl}</prop> <prop key="user">${db.user}</prop> <prop key="password">${db.password}</prop> </props> </property> <property name="poolSize" value="${db.initialPoolSize}" /> <property name="minPoolSize" value="${db.minPoolSize}" /> <property name="maxPoolSize" value="${db.maxPoolSize}" /> </bean>
- 配置每个数据源对应的hibernate的sessionFactory,这里不举例了
- 配置spring的atomikos事务
<tx:annotation-driven proxy-target-class="true"/> <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <qualifier value="jta"/> <property name="transactionManager" ref="atomikosTransactionManager"/> <property name="userTransaction" ref="atomikosUserTransaction"/> </bean> <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="3000"/> </bean>
其中的qualifier表示事务管理器的唯一标识,可以配置多个事务管理器,通过使用注解来区分该方法用哪个事务管理器处理。如@Transactional("jta")
四、spring的xa数据源代理
据说以下配置可以提高xa数据源的效率,没有验证
<bean id="dataSource1" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"> <constructor-arg ref="dataSourceSrc1"/> </bean>
相关推荐
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
springboot+Atomikos+jpa+mysql的JTA分布式事务实现,本案例涉及到2个数据库,预期结果,在同一个事务中,两个库的状态一致
spring+hibernate+jta 分布式事务管理Demo源码(无jar包) 博文链接:https://momoko8443.iteye.com/blog/190994
NULL 博文链接:https://tangshuo.iteye.com/blog/1989830
2 different databases with different user to demo the JTA tech of Atomikos
atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA) 结合spring 和durid进行配置,
春天jta-narayana JTA,JPA,Hibernate和Atomikos的Spring项目。 参考:
Atomikos,是一个基于Java的开源事务管理器,提供了事务管理和连接池,不需要应用服务器支持,支持JDBC和JMS事务,能提供对Spring,Hibernate的集成,有兴趣多了解的可以直接参考说明文当,有详细的介绍和使用说明。
37.1. Using an Atomikos Transaction Manager 37.2. Using a Bitronix Transaction Manager 37.3. Using a Narayana Transaction Manager 37.4. Using a Java EE Managed Transaction Manager 37.5. Mixing XA and ...
使用一个Atomikos事务管理器 ii. 32.2. 使用一个Bitronix事务管理器 iii. 32.3. 使用一个J2EE管理的事务管理器 iv. 32.4. 混合XA和non-XA的JMS连接 v. 32.5. 支持可替代的内嵌事务管理器 xii. 33. Spring集成 xiii....