Seata笔记
📚事务不头疼:Seata 解决分布式事务超详细笔记
🧭 目录
- 为什么要使用分布式事务?
- Seata 是什么?
- Seata 三大核心角色 🎭
- AT 模式工作流程 🚀
- Seata Server(TC)安装部署 🛠️
- 微服务整合 Seata AT 模式实战 💻
- 常见问题 & 排雷清单 ⚠️
- 小结 & 展望 🎯
1️⃣ 为什么要使用分布式事务?
在微服务架构下,一个业务操作往往需要跨多个服务、跨多个数据源。
传统单机事务(@Transactional
)只能保证单个数据库 ACID,无法解决跨库跨服务的“数据不一致”问题。
因此,我们需要分布式事务来确保全局一致性。
2️⃣ Seata 是什么?
- 官方定义:Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
- 推荐模式:官方首推 AT 模式,业务零侵入。
🍀 一句话总结:Seata = 分布式事务的“瑞士军刀”。
3️⃣ Seata 三大核心角色 🎭
角色 | 全称 | 职责 | 类比 |
---|---|---|---|
TC | Transaction Coordinator | 事务协调者:维护全局 & 分支事务状态,驱动提交/回滚 | 法官 👨⚖️ |
TM | Transaction Manager | 事务管理器:定义全局事务边界(开始/提交/回滚) | 指挥官 🧑✈️ |
RM | Resource Manager | 资源管理器:管理分支事务资源,与 TC 通信 | 士兵 🪖 |
4️⃣ AT 模式工作流程 🚀
以“用户下单”场景为例:订单服务 + 库存服务 + 账户服务
- TM(订单服务)向 TC 申请全局事务 XID
- XID 在微服务链路透传(HTTP Header/RPC 上下文)
- 各 RM 向 TC 注册分支事务
- 执行业务 SQL 并提交本地事务(先本地提交,再全局二阶段)
- TM 通知 TC 全局提交/回滚
- TC 驱动各 RM 分支事务提交/回滚
🔑 关键点:AT 模式利用 undo_log 表实现反向补偿。
5️⃣ Seata Server(TC)安装部署 🛠️
🏷️ 版本选择
- Seata Version:2.0.0
- 下载地址:seata-server-2.0.0.zip
📦 存储模式对比
模式 | 特点 | 生产可用? |
---|---|---|
file | 单机内存 + 本地文件,性能高 | ❌ 仅测试 |
db | 数据库存储,高可用 | ✅ 推荐 |
redis | 性能高,存在数据丢失风险 | ⚠️ 需自行保障持久化 |
raft | 多 TC 数据同步(实验性) | ❌ 不成熟 |
最终选型:db + Nacos(注册 & 配置中心)
🗄️ 数据库准备
-- 创建 seata 库
CREATE DATABASE seata DEFAULT CHARACTER SET utf8mb4;
-- 执行官方脚本
mysql -uroot -p seata < seata-server-2.0.0/seata/script/server/db/mysql.sql
🪄 Nacos 配置步骤
-
注册中心
修改conf/application.yml
seata:registry:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: seatagroup: SEATA_GROUPcluster: default
-
配置中心
- 获取
script/config-center/config.txt
- 修改存储模式 & MySQL 连接
- 在 Nacos 新建
seataServer.properties
(Data ID),Group 为SEATA_GROUP
,内容即修改后的config.txt
。
- 获取
-
启动 Seata Server
Windows 双击bin/seata-server.bat
浏览器访问 http://localhost:7091(账号/密码:seata)
6️⃣ 微服务整合 Seata AT 模式实战 💻
🎯 业务场景
用户下单 → 扣库存 → 扣余额,三服务分布式事务。
🧩 整合步骤(以订单服务为例)
-
引入依赖
<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>2.0.0</version> </dependency>
-
业务库新增 undo_log 表
CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
application.yml 配置 Seata
seata:registry:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: seatagroup: SEATA_GROUPconfig:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: seatagroup: SEATA_GROUPtx-service-group: default_tx_group # 事务分组
-
全局事务入口加注解
@GlobalTransactional(name = "order-create", rollbackFor = Exception.class) public Order createOrder(OrderDTO dto) {// 本地保存订单// 远程调用库存服务 & 账户服务 }
🛒 库存 & 账户服务
- 步骤 1~3 与订单服务相同
- 仅需在扣减方法上加
@Transactional
7️⃣ 常见问题 & 排雷清单 ⚠️
问题 | 现象 | 排查思路 |
---|---|---|
ConfigNotFoundException: service.vgroupMapping.default_tx_group | 微服务启动报错 | ① 检查 seata.tx-service-group 是否配置② 确认 Nacos 配置中心存在该配置项 ③ 检查 namespace & group 一致性 |
Communications link failure | TC 启动报错 | ① 检查 seataServer.properties 中 JDBC URL / 账号 / 密码② 确认 MySQL 版本与驱动匹配 |
回滚成功但外层代码捕获不到 BusinessException | Seata 2.0.0 Bug | 建议:生产环境避免使用 2.0.0,等待后续修复 |
8️⃣ 小结 & 展望 🎯
- ✅ 通过 Seata,我们轻松解决了微服务下的分布式事务难题。
- ⚙️ 生产推荐:db 存储 + Nacos 双中心,避开 2.0.0 已知 Bug。
- 🚀 更多高级特性(TCC、Saga、XA 模式)以及性能调优,敬请期待后续《Seata 实战课程》!
如果本笔记对你有帮助,记得 一键三连 👍⭐🔄 哦!