Seata(AT模式)分布式事务的处理流程
通过前文的讲解及编码实践,可以看出 Seata
组件的整合与编码并不是非常复杂。只要能够正常搭建起 Seata Server
,实现分布式事务的处理只需要在代码中添加一个全局事务注解。当然,如果两句话就能让读者学会使用 Seata
处理分布式事务问题,笔者就不需要用如此大的篇幅来讲解了,归根结底还是需要读者按照本书提供的教程多实践。
为了方便读者更好地理解整合 Seata
组件后的运行流程,笔者画了一张时序图来描述整个过程,Seata
(AT
模式)分布式事务的处理流程如图 10-26 所示。
-
微服务实例启动后自动向事务协调者
Seata-Server
(TC
)进行注册,让TC
知晓各个组件的信息并建立起通信。 -
当执行
saveOrder()
方法时,订单服务TM
会向TC
发出开启全局事务的请求,同时TC
也会返回一个全局事务ID
(XID
)。saveOrder()
方法开始执行,会依次执行三个微服务实例的扣减库存、删除购物项、新增订单操作。 -
当执行到扣减库存时,商品服务
RM
会向TC
(Seata Server
)请求开启一个分支事务,同时TC
也会返回一个分支事务ID
(BranchID
),并将其纳入第 2 个步骤生成的全局事务中管理。 -
商品服务
RM
执行扣减库存的操作,在数据库中执行update
语句,并记录undo_log
日志。扣减库存的SQL
语句如下:update tb_goods set goods_stock=goods_stock-1 where goods_id=xxx
与之对应的是,
undo_log
回滚日志基于上述SQL
语句执行反向操作。扣减库存是减一操作,Seata
对SQL
语句进行解析后生成并保存到undo_log
表中的反向回滚SQL
日志如下:update tb_goods set goods_stock=goods_stock+1 where goods_id=xxx
之后,商品服务
RM
会提交本地事务,并向TC
端汇报当前分支事务的处理结果。Figure 1. 图10-26 Seata(AT 模式)分布式事务的处理流程 -
当执行到删除购物项时,购物车服务
RM
会向TC
(Seata Server
)请求开启一个分支事务,同时TC
也会返回一个分支事务ID
(BranchID
),并将其纳入第 2 个步骤生成的全局事务中管理。 -
购物车服务
RM
执行扣减库存的操作,在数据库中执行delete
语句,并记录undo_log
日志。删除购物项的SQL
语句及反向回滚SQL
语句如下:# 删除购物项 delete from tb_cart_item where cart_id=xxx #undo_log 表中的回滚 SQL insert into 'tb_cart_item' ('cart_id', 'goods_id') VALUES (xx, xxx);
之后,购物车服务
RM
会提交本地事务,并向TC
端汇报当前分支事务的处理结果。 -
当执行到新增订单时,订单服务
RM
会向TC
(Seata Server
)请求开启一个分支事务,同时TC
也会返回一个分支事务ID
(BranchID
),并将其纳入第 2 个步骤生成的全局事务中管理。 -
订单服务
RM
执行新增订单的操作,在数据库中执行insert
语句,并记录undo_log
日志。之后,订单服务RM
会提交本地事务,并向TC
端汇报当前分支事务的处理结果。新增订单的SQL
语句及反向回滚SQL
语句如下:# 新增订单 insert into tb_order('cart_id') value (xx); #undo_log 表中的回滚 SQL delete from 'tb_order' where order_id = xx;
-
订单服务
TM
根据是否发生异常来发起本次全局事务的决议:提交或回滚。因此笔者在流程图中画了两条路径,一条是基于全局事务成功提交的路径,另一条是全局事务成功回滚的路径。 -
TC
端根据订单服务TM
的决议,向其所管理的所有RM
端发起分支事务的提交或回滚。如果是提交操作,那么对应的RM
端只需要删除undo_log
日志。如果是回滚操作,则需要根据undo_log
表中的记录反向回滚本地事务把数据还原,同时删除undo_log
日志。
以上便是 Seata
(AT
模式)下处理分布式事务的全部流程。当然,除 AT
模式外,Seata
还支持 TCC
、SAGA
和 XA
事务模式。开发人员需要根据各自的业务和具体的代码来做分布式事务方案的整合。
本书中关于分布式事务的内容只是抛砖引玉,先把搭建、配置和编码的过程分享给读者,再把 Seata
关于分布式事务的处理流程详细罗列出来,希望读者能够掌握分布式事务的处理方案,并实际地运用到今后的工作或面试中。