一、Seata整体架构与核心角色

Seata(Simple Extensible Autonomous Transaction Architecture)是一款开源的分布式事务解决方案,其核心设计围绕“三大角色、两种模式、一个生命周期”展开。

1.1 三大角色

角色 简称 职责 部署方式
事务协调者 TC(Transaction Coordinator) 维护全局事务与分支事务状态,驱动事务提交/回滚 独立部署的服务端
事务管理器 TM(Transaction Manager) 定义全局事务边界:开启、提交、回滚全局事务 嵌入应用的客户端
资源管理器 RM(Resource Manager) 管理分支事务资源,注册分支事务、报告状态,执行提交/回滚 嵌入应用的客户端

1.2 分布式事务生命周期

  1. TM向TC申请开启全局事务,TC生成全局唯一的XID。

  2. RM向TC注册分支事务,关联XID。

  3. TM通知TC提交或回滚全局事务。

  4. TC驱动所有RM对分支事务进行提交或回滚。

1.3 AT模式设计思路

一阶段:
  • 业务SQL与回滚日志(undo_log)在同一个本地事务中提交。

  • 释放本地锁与连接资源,提升并发性能。

二阶段:
  • 提交:异步删除undo_log,极速完成。

  • 回滚:根据undo_log生成反向SQL,执行数据补偿。


二、Seata核心接口与实现类解析

2.1 事务管理器层

类名 职责 说明
TransactionManager 事务管理器接口 定义事务生命周期方法
DefaultTransactionManager 默认实现 通过SPI机制支持扩展
GlobalTransaction 全局事务接口 提供事务开启、提交、回滚等方法
DefaultGlobalTransaction 默认实现 持有TransactionManager,支持事务嵌套与角色控制

2.2 代理与拦截机制

组件 作用
GlobalTransactionScanner Spring Bean后处理器,对@GlobalTransactional@GlobalLock注解的方法进行AOP代理
GlobalTransactionalInterceptor 方法拦截器,实现事务启停、提交回滚逻辑
TransactionalTemplate 模板类,封装“开启事务→执行业务→提交/回滚”流程

2.3 事务协调器(TC)核心

类名 职责
DefaultCoordinator TC默认实现,接收TM/RM的RPC请求
Core TC核心处理器,处理RM/TM的各类事务请求
ATCore AT模式核心处理器,负责分支注册、状态报告、锁查询等

2.4 会话与锁管理

组件 说明
GlobalSession 全局会话,对应一个全局事务,管理多个BranchSession
BranchSession 分支会话,对应一个分支事务,持有锁信息
LockManager 锁管理器,将lockKey转为行锁列表,委托Locker处理
Locker 锁接口,提供加锁、释放、查询等方法

2.5 资源管理器(RM)层

类名 职责
ResourceManager 资源管理器接口
DefaultResourceManager 默认实现,委派给具体ResourceManager
DataSourceManager AT模式核心管理器,负责资源注册、提交、回滚等

2.6 数据源代理与Undo日志

组件 作用
DataSourceProxy 数据源代理,拦截SQL生成undo_log
UndoLogManager Undo日志管理器,负责写入、删除、查询undo_log
SQLRecognizer SQL识别器,解析SQL类型、表名、别名等
UndoExecutorFactory 根据SQL类型生成对应的Undo执行器,实现反向补偿

三、Seata AT模式源码执行流程详解

3.1 一阶段:本地事务提交与Undo日志记录

java

// 伪代码示例:一阶段执行
try {
    // 1. 注册分支事务
    register();
    // 2. 写入undo_log
    UndoLogManagerFactory.getUndoLogManager(dbType).flushUndoLogs(this);
    // 3. 提交本地事务
    targetConnection.commit();
} catch (Throwable ex) {
    // 异常处理与报告
    report(false);
    throw new SQLException(ex);
}

3.2 二阶段:异步提交或回滚补偿

  • 提交成功:TC通知RM异步删除undo_log

  • 回滚请求:RM根据XID与BranchID查找undo_log,生成反向SQL执行补偿

3.3 关键流程示意图

  1. TM发起全局事务 → TC创建GlobalSession

  2. RM执行本地事务 → 注册分支 + 写入undo_log

  3. TM通知TC提交/回滚

  4. TC驱动RM执行最终操作


四、总结与展望

Seata通过清晰的角色分离、二阶段异步化设计、基于undo_log的补偿机制,实现了高性能、高可用的分布式事务解决方案。其源码结构清晰、模块分明,是学习分布式事务设计与实现的优秀范本。

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐