Seata 简介:分布式事务的一站式解决方案
在微服务架构中,跨服务的事务一致性是典型难题。Seata(Simple Extensible Autonomous Transaction Architecture)作为阿里开源的分布式事务解决方案,通过简洁的架构设计和高效的处理机制,为分布式事务提供了高性能、易集成的解决方案。
Seata 的核心目标
Seata 旨在解决微服务拆分后的数据一致性问题,核心目标包括:
- 提供简单易用的分布式事务服务,降低开发成本;
- 保证分布式事务的 ACID 特性(原子性、一致性、隔离性、持久性);
- 支持高性能事务处理,减少对业务系统的性能影响;
- 兼容主流框架(Spring Cloud、Dubbo 等)和存储中间件(MySQL、Redis 等)。
Seata 的核心组成:一 ID + 三组件
Seata 的架构由一个全局事务 ID和三个核心组件构成,协同完成分布式事务的管理。
Transaction ID(全局事务 ID)
- 定义:全局唯一的事务标识(XID),用于关联分布式事务中的所有分支事务;
- 作用:在跨服务调用时,通过 XID 追踪整个事务链路,确保所有分支事务属于同一全局事务。
三大核心组件
(1)TC(Transaction Coordinator - 事务协调者)
- 角色:分布式事务的 “指挥中心”,独立部署的 Seata Server 即 TC;
- 职责:
- 维护全局事务和分支事务的状态(如 “开始”“提交中”“回滚中”);
- 接收 TM 的请求,驱动全局事务的提交或回滚;
- 协调 RM 执行分支事务的提交或回滚。
(2)TM(Transaction Manager - 事务管理器)
- 角色:全局事务的发起者(如订单服务);
- 职责:
- 定义全局事务的范围(标记事务的开始、提交、回滚);
- 向 TC 申请创建全局事务,获取 XID;
- 在事务结束时,向 TC 发起全局提交或回滚请求。
- 使用方式:通过
@GlobalTransactional注解标记全局事务入口方法。
(3)RM(Resource Manager - 资源管理器)
- 角色:分布式事务的参与者(如库存服务、支付服务);
- 职责:
- 管理分支事务涉及的本地资源(如数据库连接);
- 向 TC 注册分支事务,将其关联到 XID 对应的全局事务;
- 接收 TC 的指令,执行分支事务的提交或回滚。
Seata 的事务处理流程
Seata 通过 “全局事务 + 分支事务” 的双层结构实现分布式事务管理,核心流程如下:
- 开启全局事务
- TM(如订单服务)调用业务方法,通过
@GlobalTransactional触发全局事务; - TM 向 TC 申请创建全局事务,TC 生成 XID 并返回给 TM;
- XID 通过服务调用链路(如 Feign、Dubbo)传播到所有参与的微服务。
- TM(如订单服务)调用业务方法,通过
- 注册分支事务
- 每个 RM(如库存服务、支付服务)在执行本地事务时,向 TC 注册分支事务,将其关联到 XID;
- TC 记录分支事务与 XID 的映射关系,跟踪所有分支的状态。
- 执行分支事务
- RM 执行本地业务逻辑(如扣减库存、创建支付记录),并将本地事务状态报告给 TC;
- 若所有分支事务执行成功,TM 向 TC 发起全局提交请求;
- 若任一分支事务执行失败,TM 向 TC 发起全局回滚请求。
- 全局提交 / 回滚
- TC 收到全局提交请求后,通知所有 RM 提交各自的分支事务;
- TC 收到全局回滚请求后,通知所有 RM 回滚各自的分支事务;
- 所有 RM 执行完毕后,向 TC 反馈结果,TC 更新全局事务状态为 “完成”。
Seata 的事务模式
Seata 支持多种分布式事务模式,适配不同业务场景:
- AT 模式(Automatic Transaction)
- 特点:无侵入式设计,基于本地事务和 undo 日志实现自动提交 / 回滚;
- 原理:
- 执行本地事务时,Seata 拦截 SQL,生成 undo 日志(用于回滚);
- 全局提交时,异步删除 undo 日志;全局回滚时,通过 undo 日志恢复数据;
- 适用场景:纯关系型数据库场景,要求高性能且开发侵入小。
- TCC 模式(Try-Confirm-Cancel)
- 特点:业务侵入式设计,需手动实现 Try(资源检查 / 预留)、Confirm(确认操作)、Cancel(取消操作)三个接口;
- 适用场景:非关系型数据库(如 Redis)或复杂业务场景,需要自定义资源控制逻辑。
- SAGA 模式
- 特点:长事务模式,基于状态机和补偿事务实现;
- 原理:将分布式事务拆分为多个本地事务,每个事务对应一个补偿操作,若某步失败则执行反向补偿;
- 适用场景:长事务场景(如订单超时取消),业务流程可拆分且支持补偿。
- XA 模式
- 特点:基于数据库 XA 协议(强一致性),依赖数据库本身的事务支持;
- 适用场景:对一致性要求极高的场景,但性能较低,适合短事务。
Seata 的优势
- 简单易用:通过注解(
@GlobalTransactional)快速集成,开发者无需关注底层细节; - 高性能:AT 模式下通过本地事务 + 异步提交,性能接近本地事务;
- 灵活性:支持多种事务模式,适配不同业务场景;
- 生态兼容:无缝集成 Spring Cloud、Dubbo 等微服务框架,支持 MySQL、Oracle 等主流数据库。
总结
Seata 通过 “一 ID + 三组件” 的架构,为分布式事务提供了灵活、高效的解决方案。其核心在于通过 TC 协调全局事务,TM 定义事务范围,RM 执行分支事务,最终保证跨服务数据的一致性
v1.3.10