分布式事务
概述
- 在分布式系统中实现事务,他其实是由多个本地事务组合而成。
分布式事务的主要实现有以下方案
- XA方案
- TCC方案
- SAGA方案
- 本地消息表
- 可靠消息最终一致性方案
- 最大努力通知方案
两阶段提交方案/XA方案
- XA方案:两阶段提交,有一个事务管理器的概念,负责协调多个数据的事务,事务管理器先访问各个数据库你准备好了吗?如果每个数数据库都回复OK,那么久正式提交事务,在各个数据库上执行操作;如果其中任何一个数据库回答NO,那么久回滚事务。
2PC
(Two-phase commit proticol),中文叫二阶段提交
二阶段提交是一种强一致性设计。引入一个管理者协调各参与者(各本地资源)的提交回滚。二阶段指的是准备和提交两个阶段
3PC
- 2PC他在参与者中也引入了超时机制,并且新增了一个阶段使得参与者可以利用这一个阶段统一各自的状态
- 3PC包含了三个阶段,分别是准备阶段、预提交阶段和提交阶段,对应的英文就是:CanConmit、PerCommit和DoCommit.
TCC
- 2PC和3PC都是数据库层面的,而TCC是业务层面的分布式事务
- TCC 指的是 Try-Confirm-Cancel。
- Try 指的是预留,即资源的预留和锁定,注意是预留。
- Confirm 指的是确认操作,这一步其实就是真正执行了。
- Cancel 指的是撤销操作, 可以理解为把预留阶段的动作撤销了。
本地消息表
- 本地消息表其实就是利用了 各系统本地的事务来实现分布式事务
- 有一张存放本地消息的表,一般都是放在数据库中,然后在执行业务的时候,将业务的执行和将消息的放入消息表中的操作放在同一个事务中,这样就能保证消息放入本地表中的业务肯定是执行成功的。
- 然后再去调用下一个操作,如果下一个操作调用成功了好说,消息表的消息可以直接改成已成功。如果调用失败也没事,会有后台任务定时去读取本地消息表,筛选出还未成功的消息再调用对应的服务,服务更新成功了再变更消息的状态。
消息事务
- RocketMQ就很好的支持了消息事务
最大努力通知
- 最大努力通知其实只是表明了一种柔性事务的思想:我已经尽我的最大努力想达成事务的最终一致了。