SpringCloud 微服务架构与 Seata 分布式事务实践
https://github.com/WuSangui571/cloud-demo 中的 README.md 文件浏览,此处发表的是经由 AI 润色过的精简版。
1. Seata 概述
在微服务架构中,一个业务操作(如采购)可能涉及多个服务(如库存、订单、账户),每个服务连接独立的数据库。如何确保多事务的统一提交或回滚成为关键问题。Seata(https://seata.apache.org/zh-cn/),由阿里巴巴开源的分布式事务解决方案,旨在提供高性能、易用的分布式事务管理。
1.1 示例场景
业务流程:用户采购商品,库存减一,创建订单,扣减账户余额。任何环节失败需全部回滚。
传统事务局限:单体服务使用
@EnableTransactionManagement和@Transactional实现本地事务,但分布式环境下的独立事务无法统一管理。
1.2 分布式事务挑战
传统本地事务(如 @Transactional)在分布式微服务中无效,因为各服务实例相互独立,无法实现跨服务回滚。Seata 通过以下三组件解决此问题:
TC (Transaction Coordinator):维护全局和分支事务状态,协调提交或回滚。
TM (Transaction Manager):定义全局事务边界,发起提交或回滚。
RM (Resource Manager):管理分支事务资源,与 TC 交互注册和报告状态。
2. Seata 集成与配置
2.1 下载与启动
下载 Seata:
从 https://seata.apache.org/zh-cn/download/seata-server 下载 Seata 服务器(推荐与
spring-cloud-alibaba-dependencies版本一致,例如 2.1.0)。
启动服务器:
解压后进入
bin目录,执行seata-server.bat。访问
http://localhost:7091,默认账号密码为seata(注意:2.5.0 版本可能无法正常访问控制台)。
验证:确认控制台可访问。
2.2 添加依赖
在需要分布式事务的模块中添加:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>2.3 配置 Seata
本地配置文件
file.conf:
service {
vgroupMapping.default_tx_group = "default"
default.grouplist = "127.0.0.1:8091"
enableDegrade = false
disableGlobalTransaction = false
}
Nacos 配置(可选):将
file.conf内容迁移至 Nacos,简化本地配置。
2.4 启用全局事务
在业务入口方法上添加
@GlobalTransactional注解,开启全局事务。其他局部事务方法需保留
@EnableTransactionManagement和@Transactional。
3. Seata 工作原理
3.1 两阶段提交协议
Seata 采用两阶段提交(Two-Phase Commit)确保分布式事务一致性。
第一阶段:
解析 SQL:分析业务 SQL,但不立即执行。
查询前镜像:记录执行前数据状态(如修改前记录)。
执行业务 SQL:执行实际 SQL。
查询后镜像:记录执行后数据状态。
插入回滚日志:将前后镜像存入
undo_log表。注册分支事务:向 TC 注册并申请全局锁。
本地事务提交:提交业务数据和
undo_log。汇报状态:报告 TC 分支事务结果。
第二阶段:
成功情况:
收到 TC 提交请求,立即响应。
异步删除
undo_log记录。
失败情况:
收到 TC 回滚请求,查询
undo_log(通过 XID 和 Branch ID)。数据校验:后镜像与当前数据对比。
回滚数据:应用前镜像,删除
undo_log。
3.2 事务流程
全局事务启动:方法标注
@GlobalTransactional后,生成唯一 XID,注册至 TC。分支事务:每个远程调用(如扣减库存、创建订单)作为分支,汇报状态。
结束:所有分支完成,TC 决定提交或回滚。
4. Seata 事务模式
Seata 支持四种事务模式,适应不同场景:
AT 模式:
自动模式,Seata 管理所有操作,推荐使用。
基于两阶段提交,无需手动干预。
XA 模式:
基于数据库 XA 协议,第一阶段不提交,性能较低。
配置:
seata.data-source-proxy-mode=XA。优势:兼容主流关系型数据库,不推荐。
TCC 模式:
手动实现两阶段(Try、Confirm、Cancel),适合复杂业务。
需自定义实现,灵活性高。
Saga 模式:
适合长事务(如数天业务),结合消息队列。
- 微信
- 赶快加我聊天吧

- 赶快加我聊天吧
