Seata中间件的重要概念

在验证分布式事务的代码前,笔者先介绍 Seata 中间件中的几个重要概念,以便读者能够更好地理解本节的内容。图 10-24 是 Seata 官方提供的分布式事务处理中几个角色的简易流程图。

image 2025 04 18 11 18 27 377
Figure 1. 图10-24 TC、TM、RM三者间的分布式事务处理流程图

图 10-24 中概括了使用 Seata 处理分布式事务时的几个重要角色,主要有 TCTMRM,这三个角色的功能及作用如下。

  • TC(Transaction Coordinator):这个角色是事务协调者。它负责维护全局事务和分支事务的状态,驱动全局事务提交或回滚,Seata Server 就扮演这个角色。

  • TM(Transaction Manager):这个角色是事务管理器。它负责定义全局事务的范围,开始全局事务、提交或回滚全局事务。

  • RM(Resource Manager):这个角色是资源管理器。它负责管理分支事务处理的资源,与TC交互以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

TC 就是 Seata Server,这个不用多做解释。为了让读者快速理解 Seata 分布式事务处理时 TMRM 这两个角色,笔者将结合实际的代码来讲解。

在项目启动成功后,在日志中可以看到如下内容:

image 2025 04 18 11 19 35 568

即微服务实例在启动后会分别向 Seata Server 注册事务管理器 TM 和资源管理器 RM。在 spring-cloud-alibaba-seata-demo 项目中有三个微服务实例,成功启动后会依次注册订单服务 TM、订单服务 RM、商品服务 TM、商品服务 RM、购物车服务 TM 和购物车服务 RM

在生成订单的 saveOrder() 方法中,会依次执行扣减库存、删除购物项、保存订单这三个操作。在这个方法中,如果整个方法中的逻辑及涉及的业务全部处理成功,就表示全局事务执行成功并触发 Commit 方法进行数据入库。如果在这个方法中出现异常,则需要全部回滚。这个方法决定了全局事务的开启、提交、回滚,因此 order-service-demo 项目作为这次分布式事务的开端,本次全局事务的事务管理器是订单服务 TM

商品服务 TM 和购物车服务 TM 虽然也注册了,但是它们并没有开启全局事务的代码。

saveOrder() 方法运行时分别执行扣减库存、删除购物项、保存订单的操作,涉及三个微服务实例和三个不同的数据库。在全局事务开启后,也会依次开启三个分支事务,而这三个分支事务的管理分别由订单服务 RM、商品服务 RM 和购物车服务 RM 处理。

最终,结合 Seata 中间件处理分布式事务时的三个重要角色,总结出 spring-cloud-alibaba-seata-demo 项目处理分布式事务的流程,如图 10-25 所示。

image 2025 04 18 11 21 21 042
Figure 2. 图10-25 spring-cloud-alibaba-seata-demo 项目处理分布式事务的流程