文章目录
- 一、分布式事务
- 1.什么是分布式事务
- 2.分布式事务的思想
- 二、Seata框架
- 1.认识Seata
- 2.事务管理三个重要角色
- 3.事务模式
- 4.二阶段提交
- 5.XA模式
- 6.AT模式
- 7.AT模式与XA模式的区别
- 8. TCC 模式
- 9.Saga 模式
一、分布式事务
1.什么是分布式事务
传统的单体项目被拆分成多个微服务,一个完整的流程可能涉及到多个服务之间的调用,多个服务的入库操作,为了满足事务的ACID原则,提出了分布式事务。
2.分布式事务的思想
找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。
二、Seata框架
1.认识Seata
解决分布式事务的方案有很多,但实现起来都比较复杂,因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata了
https://seata.apache.org/zh-cn/docs/overview/what-is-seata/
2.事务管理三个重要角色
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
- TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
- RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其中,TM和RM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TM和RM就会协助微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。
而TC服务则是事务协调中心,是一个独立的微服务,需要单独部署。
3.事务模式
Seata支持四种不同的分布式事务解决方案:
- XA
- TCC
- AT
- SAGA
4.二阶段提交
一阶段:
- 事务协调者通知每个事务参与者执行本地事务
- 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁
二阶段:
- 事务协调者基于一阶段的报告来判断下一步操作
- 如果一阶段都成功,则通知所有事务参与者,提交事务
- 如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务
5.XA模式
一阶段不提交sql语句,等二阶段再提交
RM一阶段的工作:
- 注册分支事务到TC
- 执行分支业务sql但不提交
- 报告执行状态到TC
TC二阶段的工作:
- TC检测各分支事务执行状态
- 如果都成功,通知所有RM提交事务
- 如果有失败,通知所有RM回滚事务
RM二阶段的工作:
- 接收TC指令,提交或回滚事务
6.AT模式
RM一阶段的工作:
- 注册分支事务
- 记录undo-log(数据快照)
- 执行业务sql并提交
- 报告事务状态
二阶段提交时RM的工作: - 删除undo-log即可
二阶段回滚时RM的工作: - 根据undo-log恢复数据到更新前
7.AT模式与XA模式的区别
- XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
- XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。(undoLog日志)
- XA模式强一致;AT模式最终一致
8. TCC 模式
不依赖于底层数据资源的事务支持:
- 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
- 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
- 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
9.Saga 模式
一般用于长事务,它是一种基于失败的设计。
- 子事务(或流程),提交是本地事务级别的,没有所谓的全局锁,在长事务流程下,避免了长时间的资源锁定;另外这种流水线的处理模型天然符合阶段式信号处理模型,能发掘出更高的性能和吞吐。
- 正向服务和补偿服务都是交给业务开发实现的
正向服务:当执行到T3事务失败的时候,不断重试T3事务,继续执行T4 …Tn
补偿服务:当执行到T3事务失败的时候,回滚前面的T1、T2、T3事务