必须部署Seata Server(TC)并配置undo_log表,业务服务需引入seata-spring-boot-starter、用DataSourceProxy代理数据源、配置匹配的tx-service-group,且在入口方法加@GlobalTransactional注解。

在 Spring Boot 中用 Seata 保证跨服务数据一致性,核心是让多个本地事务纳入同一个全局事务生命周期管理。关键不在于写多少代码,而在于理清角色分工、配对组件、补全必要基础设施 —— 尤其是 undo_log 表 和 Seata Server(TC) 这两个容易被跳过的环节。
必须部署 Seata Server(TC)并确保可连通
Seata 不是纯客户端库,它依赖独立运行的事务协调器(TC)。没有 TC,@GlobalTransactional 注解不会生效,所有分支事务各自提交,形同虚设。
- 推荐用 Docker 启动:
docker run -d --name seata-server -p 8091:8091 -e SEATA_CONFIG_NAME=file:/seata-config/registry.conf seataio/seata-server:1.7.0 - 确认 registry.conf 配置正确:注册中心(如 Nacos)地址、命名空间、分组需与业务服务一致;若用 file 模式,确保 conf 目录挂载且 registry.conf 中
service.vgroupMapping.my_tx_group=default与业务配置匹配 - 启动后访问
http://localhost:8091(默认账号 seata/seata),能打开控制台即表示 TC 已就绪
业务服务端要完成三件基础配置
Spring Boot 服务作为 TM(事务发起方)和 RM(资源管理者),需同时承担两个角色,配置缺一不可。
-
加依赖:优先选
io.seata:seata-spring-boot-starter(官方维护,适配新版本),避免混用 alibaba-cloud-seata starter(易与 Spring Cloud Alibaba 版本冲突) -
配数据源代理:必须用
DataSourceProxy包装原始数据源,否则 Seata 无法拦截 SQL、生成 undo_log。Spring Boot 2.6+ 需显式声明该 Bean:
-
填对事务组名:application.yml 中
seata.tx-service-group: my_tx_group必须与 TC 配置中vgroupMapping.my_tx_group的值完全一致,且全局唯一。不同微服务若属同一逻辑事务域,必须用相同 group 名
在业务方法上标注 @GlobalTransactional 并验证传播
该注解标记的是全局事务起点,不是普通 @Transactional。它会生成 XID,并通过 Feign / Dubbo / RestTemplate 等调用链自动透传到下游服务。
立即学习“Java免费学习笔记(深入)”;
- 只加在最外层入口方法(如 Controller 的接口方法或 Service 的主干方法),不要嵌套加
- 下游服务无需额外引入 Seata starter,但必须同样配置了
DataSourceProxy和匹配的tx-service-group,才能识别 XID 并注册为分支事务 - 测试时故意在第二步抛异常(如 throw new RuntimeException()),观察两个库是否都回滚 —— 这是验证 AT 模式是否真正生效的黄金标准
别忘了每个数据库都要建 undo_log 表
AT 模式靠 undo_log 实现自动回滚。这个表不是 Seata Server 创建的,而是由每个参与事务的业务库自行提供。
- MySQL 示例(字符集用 utf8mb4):
- 表名、字段名、索引名必须完全一致,大小写敏感;PostgreSQL / Oracle 有对应 DDL,需按官网文档选用
- 如果启动时报 “undo_log not found”,第一反应不是改代码,而是查这个表是否存在、是否拼错、是否在正确的 schema 下


















