在之前的文章"如何合理的使用动态数据源"中,其实也提到了分布式事务相关的场景如:利用多数据源实现读写分离,但直接使用动态数据源频繁其实是很消耗资源的,而且就是当业务service一个方法中的业务涉及到多数据源来回操作的时候会存在没法保证事务的ACID,基于多数据源这个事务问题,找到了一个比较好的解决方案,能进行分布式的处理,还能保住事务的ACID,首先我们先了解一下什么事务?事务的四大特性分别都是什么意思?

事务:是一组SQL组成的"逻辑处理单元"。

原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。

一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

1. 那什么是分布式事务?

其实简单的理解就是为了保证"不同数据库的数据的一致性"。

2. 分布式事务产生的场景"数据库的分库分表"和"SOA服务化"。

3. 那要想做到做的分布式事务,我们应当怎么做了,最好的办法我们先去了解什么是XA协议。

个人对上面文字理解如下(不一定对,只是个人的理解):

正确理解如下:

3. XA模式的优缺点:

优点:简单,使用分布式成本低。

缺点:性能不理想,XA无法满足高并发的场景,许多Nosql是不支持XA协议的。

4. 其实除了XA这种解决分布式事务的方法外,还有如下的解决方案,其他的解决方案等有时间再整理。

解决方案:XA,可靠性消息模式,TCC,补偿模式

5. 重点来了,就是Atomikos了,Atomikos是一个为Java平台提供的开源事务管理器。

主要功能:全面奔溃/重启恢复,嵌套事务,为XA和非XA提供内置的JDBC适配器,是标准SUM公司的JTA API的实现。

6. 既然都已经介绍了Atomikos强大功能了,那我们一起搭建一个基于SSM框架的测试代码,测试这个Atomikos的功能是不是都是吹的,核心配置如下:

pom.xml 配置如下:

<!-- 第一步:实现了XA协议的开源第三方支持包  -->
<dependency><groupId>com.atomikos</groupId><artifactId>atomikos-util</artifactId><version>3.7.0</version>
</dependency>
<dependency><groupId>com.atomikos</groupId><artifactId>transactions-jta</artifactId><version>3.7.0</version>
</dependency>
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions</artifactId>
<version>3.7.0</version>
</dependency>
<dependency><groupId>com.atomikos</groupId><artifactId>transactions-api</artifactId><version>3.7.0</version>
</dependency>
<dependency><groupId>com.atomikos</groupId><artifactId>transactions-jdbc</artifactId><version>3.7.0</version>
</dependency>
<dependency><groupId>org.codehaus.btm</groupId><artifactId>btm</artifactId><version>2.1.4</version>
</dependency>
<!-- 第一步:实现了XA协议的开源第三方支持包  -->

config.properties 配置如下:

# =====================本地环境=====================
his.db.url=jdbc:mysql://localhost:3306/his?useUnicode=true&amp;characterEncoding=UTF-8
his.db.user=root
his.db.password=roothispay.db.url=jdbc:mysql://localhost:3306/his_pay?useUnicode=true&amp;characterEncoding=UTF-8
hispay.db.user=root
hispay.db.password=root
# =====================本地环境=====================

jta.properties 配置如下:

com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.console_file_name = tm.out
com.atomikos.icatch.log_base_name = tmlog
com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm
com.atomikos.icatch.console_log_level = INFO
# out log
com.atomikos.icatch.output_dir=/hello/atomikos
com.atomikos.icatch.log_base_dir=/hello/atomikos
com.atomikos.icatch.serial_jta_transactions=false

spring-dispatcher.xml 核心配置如下:

<context:property-placeholder location="classpath:config.properties" />
<bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"destroy-method="close" abstract="true"><property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/><property name="poolSize" value="10" /><property name="minPoolSize" value="10"/><property name="maxPoolSize" value="30"/><property name="borrowConnectionTimeout" value="60"/><property name="reapTimeout" value="20"/><!-- 最大空闲时间 --><property name="maxIdleTime" value="60"/><property name="maintenanceInterval" value="60"/><property name="loginTimeout" value="60"/><property name="testQuery"><value>select 1</value></property>
</bean><!-- his数据源  -->
<bean id="hisDataSource" parent="abstractXADataSource"><!-- value只要两个数据源不同就行,随便取名 --><property name="uniqueResourceName" value="mysql/his" /><property name="xaDataSourceClassName"value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" /><property name="xaProperties"><props><prop key="URL">${his.db.url}</prop><prop key="user">${his.db.user}</prop><prop key="password">${his.db.password}</prop><prop key="pinGlobalTxToPhysicalConnection">true</prop></props></property>
</bean><bean id="hispayDataSource" parent="abstractXADataSource"><!-- value只要两个数据源不同就行,随便取名 --><property name="uniqueResourceName" value="mysql/hispay" /><property name="xaDataSourceClassName"value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" /><property name="xaProperties"><props><prop key="URL">${hispay.db.url}</prop><prop key="user">${hispay.db.user}</prop><prop key="password">${hispay.db.password}</prop><prop key="pinGlobalTxToPhysicalConnection">true</prop></props></property>
</bean><bean id="hisSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="hisDataSource" /><property name="mapperLocations" value="classpath:mybatis/xml/his/*Mapper.xml" />
</bean><bean id="hispaySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="hispayDataSource" /><property name="mapperLocations" value="classpath:mybatis/xml/hispay/*Mapper.xml" />
</bean><bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"init-method="init" destroy-method="close"><!-- atomikosTransactionManager 这个事务管理器可以关闭事务true  --> <property name="forceShutdown"><value>true</value></property>
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"><property name="transactionTimeout" value="300" />
</bean><bean id="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"><property name="transactionManager"><ref bean="atomikosTransactionManager"/></property><property name="userTransaction"><ref bean="atomikosUserTransaction"/></property><!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default --><property name="allowCustomIsolationLevels" value="true"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="cn.edu.his.pay.mapper.his"/><property name="sqlSessionFactoryBeanName" value="hisSqlSessionFactory" />
</bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="cn.edu.his.pay.mapper.hispay"/><property name="sqlSessionFactoryBeanName" value="hispaySqlSessionFactory" />
</bean><!-- 一定要开启注解事务支持  -->
<tx:annotation-driven transaction-manager="transactionManager"/>

总结:到这里Atomikos集成到SSM框架就算完成了,这篇文章就不进行详细的,对于Atomikos(分布式事务管理框架)的特性,我会在下篇文章中写测试代码去分别测试Atomikos的强大功能。

spring整合atomikos实现分布式事务的方法示例_分布式-分布式事务处理相关推荐

  1. spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA

    在介绍这两个概念之前,我们先看看是什么是X/Open DTP模型. X/Open X/Open,即现在的open group,是一个独立的组织,主要负责制定各种行业技术标准.X/Open组织主要由各大 ...

  2. spring整合atomikos实现分布式事务的方法示例_分布式事务一:基于数据库原生分布式事务方案实现...

    1.分布式事务模型 ACID 实现 1.1.X/Open XA 协议(XA) 最早的分布式事务模型是 X/Open 国际联盟提出的 X/Open Distributed Transaction Pro ...

  3. java分布式事务 实例_spring整合atomikos实现分布式事务的方法示例

    前言 Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理跨数据库事务,比如某个指令在A库和B库都有写操作,业务上要求A库和B库的写操作要具有原子性,这时候就可以用到 ...

  4. 解决在Spring整合Hibernate配置tx事务管理器出现错误的问题

    解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 参考文章: (1)解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 (2)https://www.cn ...

  5. 分布式事务 常见方法

    不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付. 又或者在网上购物明明已经扣款,但是却告诉我没有发生交易.这一系列情况都是因为没有事 ...

  6. ShardingSphere RAW JDBC 分布式事务XA 代码示例

    ShardingSphere RAW JDBC 分布式事务XA 代码示例 项目工程在:transaction-2pc-xa-raw-jdbc-example 代码简介     基于ShardingSp ...

  7. 分布式事务专题(四):分布式事务解决方案之TCC

    目录: 基础概念 分布式事务理论 分布式事务解决方案之2pc 分布式事务解决方案之TCC(本章) 分布式事务解决方案之可靠消息最终一致性 分布式事务解决方案之最大努力通知 分布式事务综合案例分析 4. ...

  8. 微服务seata 1.4.2 分布式事务TCC模式示例

    seata TCC模式和AT模式的基础环境是一样的,只是在实现方式上有所区别,而且TCC模式还可以和AT模式混合使用. 关于AT模式示例,可以参考seata 1.4.2 分布式事务AT模式示例. TC ...

  9. 分布式事务seata只支持MySQL_阿里分布式事务框架Seata原理解析

    Seata框架是一个业务层的XA(两阶段提交)解决方案.在理解Seata分布式事务机制前,我们先回顾一下数据库层面的XA方案. 1. MySQL XA方案 MySQL从5.7开始加入了分布式事务的支持 ...

最新文章

  1. word2vec模型评估_干货 | NLP中的十个预训练模型
  2. [CF816B] Karen and Coffee(前缀和,思维)
  3. c获取当前系统时间_Python系统:程序和进程
  4. 原生JS forEach()和map()遍历的区别以及兼容写法
  5. openCV4.2.0 error: (-5:Bad argument) CAP_IMAGES: can’t find starting number (in the name of file)
  6. 【视频】云信CTO阙杭宁:IM云开发经验分享
  7. 作为Java程序员应该掌握的10项技能
  8. P3768-简单的数学题【莫比乌斯反演,杜教筛】
  9. 常用并发工具类(锁和线程间通信工具类)
  10. TX2开发板Ubuntu16.04安装中文输入法
  11. Sublime Text插件
  12. 2021-2027全球与中国氢动力引擎市场现状及未来发展趋势
  13. 安卓刷java_安卓逆向刷题(攻防世界)
  14. 老王的JAVA基础课:第3课 IDEA的安装和使用
  15. 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) A.吐泡泡-STL(stack)
  16. C语言 实现长整数的相加
  17. 延时100ms c语言程序,C51单片机延时时间的计算方法解析
  18. linux install jkd
  19. win10在此计算机上找不到系统映像,图文教你win10系统使用DISM修复找不到源的问题....
  20. Archetype是什么?

热门文章

  1. [实践] Android5.1.1源码 - 让某个APP以解释执行模式运行
  2. Redis的安装及原理介绍
  3. 用HttpClient来模拟浏览器GET POST
  4. Linux操作系统中的文件管理技巧
  5. 东拉西扯:Facebook的身价
  6. 【计算机视觉】基于Shading Model(对光照变化一定不变性)的运动目标检测算法...
  7. [Codeforces677B]Vanya and Food Processor(模拟,数学)
  8. python学习6 web开发
  9. JAVA字节流(读写文件)
  10. suse 10 下mysql安装