文章目录
1.什么是分布式事务
是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。通俗讲即:一个事务包含多个操作,多个操作操作了多个数据库,这样的事务称为分布式事务
2.分布式事务产生的原因
- 服务SOA化
- 数据库分库分表
3.X/OPEN DTP模型
X/OPEN是一个组织,即现在的THE OPEN GROUP,它定义了分布式事务处理模型,其中X/OPEN DTP(X/Open Distributed Transaction Processing Reference Model)是该组织定义的一种分布式模型,其包含3中角色:
- AP (Application,应用程序)
- RM(resouces manager资源管理器),通常指数据库
- TM(transaction manager事务管理器),通常指事务协调者,负责协调和管理事务,提供给AP变成接口以及管理资源管理器
三者之间关系如下,其中TM与RM之间通信需要一套协议规范,即XA规范;为应对网络,主机故障等,TM和RM需要记录行管事务日志
3.1XA规范
是X/OPEN 提出的分布式事务处理规范,分布式事务处理的工业标准
3.1.1 XA流程
其中涉及到几个概念:
- 事务: 一个事务是一个完整的工作单元,由多个独立的计算任务组成,这多个任务在逻辑上是原子的
- 全局事务: 对于一次性操作多个资源管理器的事务,就是全局事务
- 分支事务: 在全局事务中,某一个资源管理器有自己独立的任务,这些任务的集合作为这个资源管理器的分支任务
其实全局事务和分支事务是通过两阶段几条完成的:
3.1.2 XA两阶段提交—2pc
- 第一阶段
RM在第一阶段会做两件事:
1.记录事务日志:reduo,undo
2.返回给TM信息,ok、error
存在问题: 如果第一阶段完成后TM宕机或网络出现故障了,此时RM会一直阻塞,发生了死锁,因为没有timeout机制,3pc就针对此问题进行了改造,加入了timeout机制 - 第二阶段
会出现数据不一致问题:如果RM1已commit,RM2未进行commit,此时TM宕机了,如果TM未恢复正常状态,就会出现数据不一致问题;如果TM恢复了正常状态,因为TM记录了事务,RM2会继续执行commit
3.1.3 3pc
- canCommit
- preCommit
- doCommit
3.2 JTA
3.2.1 是什么
JTA(JAVA Transaction API),即java根据XA规范提出的分布式事务处理API标准
3.2.2 作用
统一API,简化程序员的学习,简化变成
3.2.3 提供商
- TM实现提供商: weblogic,websphere(这些是JAVA EE应用服务器内建的JTA 事务管理器),JBoss,Atomikos(开源,独立的JTA事务管理器)
- RM实现提供商:多数都是数据库提供商实现的,如mysql,oracle,连接池组件一般也会提供
4. 解决方案
分布式事务处理是指一个事务可能涉及多个数据库操作,分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)
- 避免分布式事务: 不使用先有的分布式架构(很显然没有从根本上解决问题)
- 最终一致性: 最常用的使用消息队列MQ实现(其中会出现两个问题:1:消息不丢失,采用重试机制 2:避免消息重复消费,采用幂等性机制)
- 最大努力通知型: 采用补偿机制
5. 项目实战
- 使用Java EE 服务器内建的TM,配置如下:
- 使用轻量级服务器(Tomcat)+ 集成TM组件
- 引入TM组件的jar
- 配置数据源,一定钥匙XA数据源
- 配置事务管理器TM
如果是springBoot项目,配置spring-boot-starter-jta-atomikos上面这些配置就会自动配置好,不用手动配置了