目录
一、什么是分布式事务?
区别:
普通事务:
分布式事务:
- 在微服务系统中,每个微服务应用都可能会有自己的数据库,他们首先要控制自己的本地事务。
- 一项业务操作可能会调用执行多个微服务。
- 那么如何保证多个事务执行多个数据库的操作整体成功或整体失败?这就是分布式事务要解决的问题!
二、分布式事务方案
分布式事务有以下解决方案:
- XA
- TCC
- Seata 框架 AT 事务
- SAGA
- 可靠消息最终一致性
- 最大努力通知
三、Seata介绍
- Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
- Seata,意为:Simple Extensible Autonomous Transaction Architecture,是一套一站式分布式事务解决方案。
- Seata 融合了阿里巴巴和蚂蚁金服在分布式事务技术上的积累,并沉淀了新零售、云计算和新金融等场景下丰富的实践经验,但要实现适用于所有的分布式事务场景的愿景,仍有很长的路要走。
四、订单系统
当用户下单时,执行以下三步流程:
1、订单系统保存订单
2、订单系统调用库存服务,减少库存
3、订单系统调用账户服务,扣减金额
这三步作为有一个整体事务进行管理,要么整体成功,要么整体失败
五、Seata AT 基本原理
Seata AT 事务分两个阶段来管理全局事务:
第一阶段:执行各分支事务
第二阶段:控制全局事务最终提交或回滚
第一阶段: 执行各分支事务
微服务系统中,各服务之间无法感知事务是否执行成功,这时就需要一个专门的服务,来协调各个服务的运行状态。这个服务称之为TC(Transaction Coordinator,事务协调器)。
1)调用订单服务
1、订单系统开始执行保存订单命令之前,首先会启动TM(Transaction Manager,事务管理器),由 TM向TC申请开启一个全局事务:
2、这时会产生一个全局事务ID,称之为XID,并将XID传回TM:
这样就开启了全局事务!
3、全局事务开启后,开启执行创建订单的业务。首先执行保存订单,这时会先启动一个RM(Resource Manager,资源管理器),并将XID传递给RM:
4、RM负责对分支服务(即微服务的本地服务)进行管理,并与TC通信上报分支服务的执行状态、接收全局事务的提交或滚回命令。
RM首先会使用 XID 向 TC 注册分支事务, 将分支事务纳入到对应的全局事务管辖:
5、现在可以执行保存订单的分支事务。一旦分支事务执行成功,RM会上报事务状态:
6、TC收到后,会将该状态信息传递到TM:
7、到此,保存订单过程结束。
2)调用库存服务
减少库存商品,与订单的执行过程相同。
1、首先调用库存服务,启动RM,并传递XID:
2、库存服务的 RM 使用 XID 向TC进行注册,纳入全局事物管辖:
3、执行本地事务成功后上报状态,TC会将状态发送给TM:
4、执行完成。
3)完成账户分支事务:
与上述相同:
到此,全局事务全部提交完成!
第二阶段:控制全局事务最终回滚
上面是全局事务执行成功的情况,下面是失败的情况。
1、假设订单业务执行过程中,扣减账户金额这一步分支执行失败,那么失败状态会对TC上报,然后再发送给TM:
TTM会进行决策,确定全局事务的失败,向TC发送全局事务的回滚请求:
然后,TC会向所有的 RM 发送回滚指令, RM 会完成最终的回滚操作: