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

图 10-24 中概括了使用 Seata
处理分布式事务时的几个重要角色,主要有 TC
、TM
、RM
,这三个角色的功能及作用如下。
-
TC(Transaction Coordinator):这个角色是事务协调者。它负责维护全局事务和分支事务的状态,驱动全局事务提交或回滚,
Seata Server
就扮演这个角色。 -
TM(Transaction Manager):这个角色是事务管理器。它负责定义全局事务的范围,开始全局事务、提交或回滚全局事务。
-
RM(Resource Manager):这个角色是资源管理器。它负责管理分支事务处理的资源,与TC交互以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
TC
就是 Seata Server
,这个不用多做解释。为了让读者快速理解 Seata
分布式事务处理时 TM
和 RM
这两个角色,笔者将结合实际的代码来讲解。
在项目启动成功后,在日志中可以看到如下内容:

即微服务实例在启动后会分别向 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 所示。
