微服务知识——Seata AT模式:分布式事务的解决方案

发布于:2025-06-10 ⋅ 阅读:(22) ⋅ 点赞:(0)

文章目录

  • 1、二阶段提交
    • 第一阶段:表决阶段
    • 第二阶段:执行阶段
  • 2、Seata-AT模式
    • (1)TC【事务协调器】
    • (2)TM【事务管理器】
    • (3)RM【资源管理器】

Seata是一款开源的分布式事务解决方案的框架,它致力于在微服务架构下提供高性能和简单易用的分布式事务服务, Seata为用户提供了 ATTCCSAGAXA事务模式。其中 AT模式( auto transaction)是一种无侵入的分布式事务解决方案, AT模式的核心思想是基于二阶段提交实现的。

1、二阶段提交

两阶段提交协议(Two-Phase Commit2PC)是一种分布式事务处理协议,目的是在确保多个分布式系统中执行的事务能够在所有参与者中保持一致性。2PC协议通过将事务的提交过程分为两个阶段来实现确保即使在出现故障的情况下,也能保持数据的一致。2PC的实现过程如下所示:

在这里插入图片描述

第一阶段:表决阶段

(1)事务协调者向所有参与者(Participants)发送准备请求,询问它们是否能够提交事务

(2)每个参与者收到请求后,检查其本地的事务状态,确保它能够完成操作。如果参与者准备好提交,它会将其状态更改为“准备提交(Prepared)”并返回一个“准备好”响应给协调者。如果无法提交,参与者会返回“拒绝”响应。

表决阶段中所有参与者都不会将数据更改持久化到数据库中,而是保留在一个临时状态。

第二阶段:执行阶段

(1)事务协调者收到了所有参与者的“准备好"响应,它会向所有参与者发送提交请求,告知参与者可以安全地将更改写入数据库

(2)参与者收到提交请求后,将更改持久化到数据库并返回提交确认给事务协调者。

(3)如果事务协调者收到所有参与者的提交确认,它会宣布事务提交成功。如果有任何参与者拒绝提交,协调者会发送回滚请求,要求所有参与者回滚之前的操作。

2PC优点的具有简单易理解(协议流程较为简单,易于实现和理解)、保证数据的一致性(所有参与者对于事务的提交或回滚保持一致)。同时它的缺点也很明显,如阻塞(协调者崩溃时会导致参与者阻塞,无法继续处理事务)、性能问题(2PC需要多次网络往返,可能影响性能)、故障恢复复杂(处理参与者或协调者崩溃后的恢复机制比较复杂)。

2、Seata-AT模式

Seata-AT模式几个角色TCTMRM,这几个角色的概念如下所示:

(1)TC【事务协调器】

它是独立的组件,需要独立部署运行,Seata提供了这个独立运行的程序,它负责维护全局事务的运行状态,接收TM指令发起全局事务的提交与回滚,负责与RM通信,协调各个分支事务的提交或回滚。

(2)TM【事务管理器】

TM需要嵌入应用程序,它负责开启一个全局事务,并定义全局事务的范围,TM目的是最终向TC发起全局提交或回滚指令。

(3)RM【资源管理器】

RMTC通信,控制分支事务,负责分支注册、报告分支事务状态,并接收事务协调器TC的指令,命令分支事务完成本地事务的提交或回滚。

通过TCTMRM的的相互协调配合实现了分布式事务的处理,Seata-AT模式的实现原理图如下所示:

在这里插入图片描述
TM负责定义全局事务的边界,然后向TC申请开启一个全局事务,全局事务创建成功后会生成全局唯一的XID,这个XID会在微服务请求链路上下文中传播。

Seata-AT模式的第一阶段的工作:

(1)通过拦截和解析业务sql,然后根据解析sql语句中的条件生成查询前的sql语句,将查询结果当做快照后保存起来,后续如果事务回滚直接根据快照数据生成反向sql进行回滚操作。

(2)Seata实现了JDBC协议,业务与数据库交互首先要经过Seata,这样Seatasql进行了拦截与处理,处理完成后将sql发送到真实数据库执行。

由于上述操作在同一个本地事务中,那么数据库的事务特性保证数据的一致性。

Seata-AT模式的第二阶段工作:

对于AT模式,二阶段提交主要是将每个事务的参与者的快照数据删除,同时释放行锁;如果回滚,利用快照数据执行回滚。

AT模式中,需要使用Seata组件中的JDBC代理数据源DataSourceProxy,实现对真正目标数据源的代理访问,通过代理实现拦截、解析sql的执行来实现快照数据的保存,如果业务执行成功,那么就删除快照数据,如果业务执行失败就使用快照回滚。