seata项目示例之一个完整的分布式事务过程

原创
2019/09/26 16:59
阅读数 1.8W

返回主目录

 

一个完整的分布式事务大致分为以下几步:

  1. TM(bussiness) 向 TC(seata-server) 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
  2. XID 在微服务调用链路的上下文中传播。
  3. RM (account,order,storage)向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
  4. TM 向 TC 发起针对 XID 的全局提交或回滚决议。
  5. TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

相关概念

Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚;
Transaction Manager(TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议;
Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚;

我们模拟一个正常商品下单的过程,整个流程涉及到以下几个步骤:

(1)调用Bussiness服务购买商品;

(2)Bussiness调用storage服务检查并减少库存;

(3)Business调用order服务下单;

(4)order服务调用account服务入账。

模拟客户下单的整个流程如下所示

(注意:图中的全局事务和分支事务是在调用接口时,由seata代理自动注册的)

1.客户下单。

2.请求进入Business服务后,调用下单接口;

下单接口内部实现如下图所示:

该接口开启了一个全局事务,全局事务开启后会在global_table中创建一条全局事务记录(如下图所示),详细记录了全局事务的id发起者名称,事务所属服务组,接口名称等等,记录在事务结束后会自动删除。

下单接口的操作流程是 先扣库存,扣除成功后再创建订单。

3.扣减库存时调用库存服务的deduct()接口,   接口的详细实现如下图所示

该接口是在全局事务内调用的,因此可以获取到全局事务的XID,通过该ID可以去global_table中查询全局事务的详细信息,如状态等。

该接口也开启了事务,因此会创建一个分支事务,并在branch_table表中插入一条分支事务记录,分支事务信息如下

4.库存扣除成功后,调用订单服务下单。

5下单成功后,调用账户服务扣钱。

 

 

 

未完待续...

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部