分布式事务解决方案Seata 从入门到实战 一、Seata 是什么? 1.1 定义 Apache Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
1.2 核心目标 Seata 的核心目标是解决分布式系统中的数据一致性 问题,特别是在微服务架构中:
1 2 3 4 5 6 7 8 9 10 11 ┌─────────────┐ │ 订单服务 │ └──────┬──────┘ │ 调用 ▼ ┌─────────────┐ ┌─────────────┐ │ 库存服务 │─────>│ 账户服务 │ └─────────────┘ └─────────────┘ │ │ ▼ ▼ [库存 DB] [账户 DB]
问题 :当订单创建成功后,如何保证库存扣减和账户扣款要么全部成功,要么全部失败?
答案 :Seata 提供分布式事务协调能力,确保跨多个数据库的操作保持数据一致性。
1.3 三大角色 Seata 分布式事务模型包含三个核心角色:
TC (Transaction Coordinator) - 事务协调者
维护全局事务状态
协调分支事务提交或回滚
独立部署的服务(Seata Server)
TM (Transaction Manager) - 事务管理器
定义全局事务边界
发起全局事务的提交或回滚
位于业务应用的入口
RM (Resource Manager) - 资源管理器
管理本地资源(数据库连接)
执行分支事务的提交/回滚
向 TC 报告事务状态
1 2 3 4 5 6 TM (事务管理器) ↓ 发起全局事务 TC (事务协调者) ↙ ↘ RM1 RM2 (分支 1) (分支 2)
1.4 核心优势 ✅ 零侵入 : AT 模式无需修改业务代码,添加注解即可 ✅ 高性能 : 两阶段非阻塞实现,性能接近本地事务 ✅ 多语言 : 支持 Java、Go、C++ 等多种语言 ✅ 多存储 : 支持 MySQL、PostgreSQL、Oracle 等数据库 ✅ 易扩展 : 插件化设计,支持自定义扩展 ✅ 生态完善 : 与 Spring Cloud、Dubbo 等框架无缝集成
二、Seata 使用场景 2.1 典型应用场景 电商交易链路 场景描述 : 用户下单后需要扣减库存、扣款、增加积分
1 2 3 4 5 6 7 8 用户下单 ↓ @GlobalTransactional ← Seata 全局事务 ↓ ├─ 订单服务 → [订单 DB] ├─ 库存服务 → [库存 DB] ├─ 账户服务 → [账户 DB] └─ 积分服务 → [积分 DB]
为什么需要 Seata :
4 个微服务分别操作不同的数据库
必须保证所有操作要么全部成功,要么全部失败
不能接受部分成功导致的数据不一致
支付清算系统 场景描述 : 支付成功后,更新订单状态、记录流水、通知商户
痛点 :
跨银行、第三方支付多个系统
资金安全要求极高
需要完整的事务追溯能力
Seata 价值 :
保证支付操作的原子性
提供完整的事务日志
支持异常事务的人工介入
供应链管理系统 场景描述 : 采购订单创建后,同步更新供应商库存、物流信息、财务应付账款
特点 :
跨企业系统协作
数据一致性要求高
网络不稳定因素多
2.2 不适合的场景 ❌ 单体应用 : 单个数据库直接本地事务即可 ❌ 强一致性要求 : 银行核心转账等需要 XA 强一致性 ❌ 超高性能场景 : 对延迟极其敏感的实时交易系统 ❌ 简单查询操作 : 不涉及数据更新的只读操作
2.3 与其他方案对比
方案
一致性级别
性能
开发成本
适用场景
Seata AT
最终一致
⭐⭐⭐⭐
低
大多数微服务场景
Seata TCC
最终一致
⭐⭐⭐⭐⭐
高
高并发核心链路
Seata Saga
最终一致
⭐⭐⭐⭐
中
长流程编排场景
XA 协议
强一致
⭐⭐
低
金融核心系统
本地消息表
最终一致
⭐⭐⭐
中
无中间件依赖场景
事务消息
最终一致
⭐⭐⭐⭐
中
异步解耦场景
三、Seata 支持的事务模式 3.1 AT 模式(推荐默认) Automatic Transaction - 自动补偿事务
工作原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 第一阶段: 1. TM 向 TC 申请开启全局事务 2. RM 执行本地 SQL 业务 3. RM 保存前镜像和后镜像到 undo_log 4. RM 提交本地事务(释放锁) 5. RM 向 TC 汇报执行结果 第二阶段(提交): 1. TC 收到所有分支成功汇报后,发送提交请求 2. RM 异步删除 undo_log(快速返回) 第二阶段(回滚): 1. TC 收到任一分支失败汇报,发送回滚请求 2. RM 根据 undo_log 前镜像恢复数据 3. RM 提交回滚操作
优点 ✅ 零侵入 : 只需添加 @GlobalTransactional 注解 ✅ 高性能 : 一阶段提交本地事务,无锁竞争 ✅ 简单易用 : 无需编写额外代码 ✅ 支持广 : 支持常见的增删改查操作
缺点 ⚠️ 隔离性 : 读写未隔离,可能出现脏读 ⚠️ 依赖 : 需要本地事务支持和 undo_log 表
适用场景
90% 的微服务分布式事务场景
对隔离性要求不苛刻的业务
追求快速上线、降低开发成本
3.2 TCC 模式 Try-Confirm-Cancel - 三阶段补偿事务
工作原理 1 2 3 4 5 6 7 8 9 10 11 Try 阶段: - 检查资源并预留 - 例如:冻结账户余额 Confirm 阶段: - 真正使用预留资源 - 例如:扣除已冻结余额 Cancel 阶段: - 释放预留资源 - 例如:解冻余额
优点 ✅ 高性能 : 无全局锁,并发度高 ✅ 高可控 : 业务自主控制资源预留 ✅ 隔离性好 : 业务层面实现资源隔离
缺点 ❌ 高侵入 : 需实现三个接口 ❌ 开发成本高 : 需处理幂等、空回滚、悬挂等问题 ❌ 代码量大 : 是 AT 模式的 3-5 倍
适用场景
高并发核心链路(如秒杀)
对性能要求极高的场景
跨语言调用场景
3.3 Saga 模式 长事务协调器 - 适用于长流程编排
工作原理 1 2 3 4 5 正向操作:A → B → C → D ↓ ↓ ↓ ↓ 补偿操作: A' B' C' D' 任何一步失败,依次执行:C' → B' → A'
优点 ✅ 适合长流程 : 支持复杂的业务流程编排 ✅ 灵活性强 : 每个参与者可独立部署 ✅ 容错性好 : 支持人工介入处理
缺点 ❌ 不保证隔离性 : 可能丢失更新 ❌ 不保证原子性 : 补偿可能失败 ❌ 实现复杂 : 需要状态机引擎
适用场景
跨企业的长流程协作
审批流程(如贷款审批)
允许人工介入的场景
3.4 XA 模式 X/Open Distributed Transaction Processing - 强一致性协议
工作原理 1 2 3 4 5 6 7 准备阶段: - TC 询问所有 RM 是否准备好 - RM 锁定资源但不提交 提交阶段: - 所有 RM 都准备好后,TC 发送提交指令 - RM 提交本地事务
优点 ✅ 强一致性 : 完全符合 ACID 特性 ✅ 标准化 : 遵循 X/Open 标准 ✅ 简单 : 数据库原生支持
缺点 ❌ 性能差 : 阻塞协议,持有锁时间长 ❌ 死锁风险 : 容易出现死锁 ❌ 可用性低 : 单点故障影响大
适用场景
金融核心系统转账
对一致性要求极高的场景
可以接受性能损失
3.5 四种模式对比
模式
一致性
隔离性
性能
开发成本
推荐度
AT
最终一致
读未提交
⭐⭐⭐⭐
低
⭐⭐⭐⭐⭐
TCC
最终一致
业务隔离
⭐⭐⭐⭐⭐
高
⭐⭐⭐⭐
Saga
最终一致
无隔离
⭐⭐⭐⭐
中
⭐⭐⭐
XA
强一致
完全隔离
⭐⭐
低
⭐⭐
选型建议 :
首选 AT : 满足大部分场景,开发效率高
性能瓶颈选 TCC : 高并发核心链路
长流程选 Saga : 复杂编排场景
强一致选 XA : 金融核心场景
四、Seata 部署指南 4.1 环境准备 基础环境要求 :
JDK 1.8+
MySQL 5.7+ / PostgreSQL / Oracle
Maven 3.6+
Linux / macOS / Windows
可选组件 :
Nacos 2.x (配置中心 + 注册中心)
Redis (集群会话存储)
ZooKeeper / Eureka / Consul (注册中心)
4.2 下载 Seata Server 下载地址 :
下载 1.6.1 版本 :
1 2 3 4 5 6 cd /optwget https://github.com/apache/incubator-seata/releases/download/v1.6.1/seata-server-1.6.1.tar.gz docker pull apache/seata-server:1.6.1
解压安装 :
1 2 tar -zxvf seata-server-1.6.1.tar.gz cd seata
目录结构 :
1 2 3 4 5 6 7 seata/ ├── bin/ # 启动脚本 ├── conf/ # 配置文件 ├── ext/ # 扩展目录 ├── lib/ # 依赖库 ├── logs/ # 日志目录 └── resources/ # 资源文件
4.3 配置 Seata Server 4.3.1 选择存储模式 Seata 支持三种存储模式:
file 模式 (开发测试):
优点:配置简单,无需额外依赖
缺点:单机版,数据易丢失
适用:本地开发、测试环境
db 模式 (生产推荐):
优点:数据持久化,高可用
缺点:需要数据库
适用:生产环境
redis 模式 (高性能):
优点:性能最优
缺点:需要 Redis,数据可能丢失
适用:高性能场景
4.3.2 配置文件说明 编辑 conf/application.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 server: port: 7091 spring: application: name: seata-server logging: config: classpath:logback-spring.xml file: path: ${user.home}/logs/seata seata: config: type: nacos nacos: server-addr: laosan.xin:8848 namespace: "dev-wdg" group: "DEFAULT_GROUP" username: "nacos" password: "your_password" data-id: "seataServer.properties" registry: type: nacos nacos: server-addr: "laosan.xin:8848" namespace: "dev-wdg" group: "DEFAULT_GROUP" cluster: "DEFAULT" username: "nacos" password: "your_password" store: mode: db db: datasource: druid db-type: mysql driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://47.96.121.94:4306/seata?useUnicode=true&rewriteBatchedStatements=true user: root password: your_password min-conn: 5 max-conn: 30 global-table: global_table branch-table: branch_table lock-table: lock_table distributed-lock-table: distributed_lock query-limit: 100 max-wait: 5000 server: service-port: 8091 recovery: committing-retry-period: 1000 rollbacking-retry-period: 1000 timeout-retry-period: 1000 max-commit-retry-timeout: -1 max-rollback-retry-timeout: -1 client: undo: data-validation: true log-serialization: jackson only-care-update-columns: true log-table: undo_log rm: async-commit-buffer-limit: 10000 report-retry-count: 5 table-meta-check-enable: true tm: commit-retry-count: 5 rollback-retry-count: 5 default-global-transaction-timeout: 60000
4.3.3 Nacos 配置中心配置 在 Nacos 控制台创建 seataServer.properties 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 transport.type =TCP transport.server =NIO transport.heartbeat =true transport.enable-tm-client-batch-send-request =false transport.enable-rm-client-batch-send-request =true transport.enable-tc-server-batch-send-response =false transport.rpc-rm-request-timeout =30000 transport.rpc-tm-request-timeout =30000 transport.rpc-tc-request-timeout =30000 service.vgroup-mapping.default_tx_group =DEFAULT service.enable-degrade =false service.disable-global-transaction =false client.rm.async-commit-buffer-limit =10000 client.rm.lock.retry-interval =10 client.rm.lock.retry-times =30 client.rm.report-retry-count =5 client.rm.table-meta-check-enable =true client.rm.sql-parser-type =druid client.tm.commit-retry-count =5 client.tm.rollback-retry-count =5 client.tm.default-global-transaction-timeout =60000 client.undo.data-validation =true client.undo.log-serialization =jackson client.undo.only-care-update-columns =true server.undo.log-save-days =7 server.undo.log-delete-period =86400000 tcc.fence.log-table-name =tcc_fence_log tcc.fence.clean-period =1h log.exception-rate =100 metrics.enabled =false metrics.registry-type =compact metrics.exporter-list =prometheus metrics.exporter-prometheus-port =9898
4.4 数据库初始化 创建数据库并初始化表结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 CREATE DATABASE IF NOT EXISTS seata DEFAULT CHARACTER SET utf8mb4;USE seata;CREATE TABLE IF NOT EXISTS `global_table` ( `xid` VARCHAR (128 ) NOT NULL COMMENT '全局事务 ID' , `transaction_id` BIGINT COMMENT '事务 ID' , `status` TINYINT NOT NULL COMMENT '事务状态' , `application_id` VARCHAR (32 ) COMMENT '应用 ID' , `transaction_service_group` VARCHAR (32 ) COMMENT '事务服务组' , `transaction_name` VARCHAR (128 ) COMMENT '事务名称' , `timeout` INT COMMENT '超时时间' , `begin_time` BIGINT COMMENT '开始时间' , `application_data` VARCHAR (2000 ) COMMENT '应用数据' , `gmt_create` DATETIME COMMENT '创建时间' , `gmt_modified` DATETIME COMMENT '修改时间' , PRIMARY KEY (`xid` ), KEY `idx_status_gmt_modified` (`status` , `gmt_modified` ), KEY `idx_transaction_id` (`transaction_id` ) ) ENGINE =InnoDB DEFAULT CHARSET =utf8mb4 COMMENT ='全局事务表' ; CREATE TABLE IF NOT EXISTS `branch_table` ( `branch_id` BIGINT NOT NULL COMMENT '分支事务 ID' , `xid` VARCHAR (128 ) NOT NULL COMMENT '全局事务 ID' , `transaction_id` BIGINT COMMENT '事务 ID' , `resource_group_id` VARCHAR (32 ) COMMENT '资源组 ID' , `resource_id` VARCHAR (256 ) COMMENT '资源 ID' , `branch_type` VARCHAR (8 ) COMMENT '分支类型' , `status` TINYINT COMMENT '状态' , `client_id` VARCHAR (64 ) COMMENT '客户端 ID' , `application_data` VARCHAR (2000 ) COMMENT '应用数据' , `gmt_create` DATETIME(6 ) COMMENT '创建时间' , `gmt_modified` DATETIME(6 ) COMMENT '修改时间' , PRIMARY KEY (`branch_id` ), KEY `idx_xid` (`xid` ) ) ENGINE =InnoDB DEFAULT CHARSET =utf8mb4 COMMENT ='分支事务表' ; CREATE TABLE IF NOT EXISTS `lock_table` ( `row_key` VARCHAR (128 ) NOT NULL COMMENT '行锁键' , `xid` VARCHAR (128 ) COMMENT '全局事务 ID' , `transaction_id` BIGINT COMMENT '事务 ID' , `branch_id` BIGINT NOT NULL COMMENT '分支事务 ID' , `resource_id` VARCHAR (256 ) COMMENT '资源 ID' , `table_name` VARCHAR (32 ) COMMENT '表名' , `pk` VARCHAR (36 ) COMMENT '主键' , `status` TINYINT NOT NULL DEFAULT '0' COMMENT '状态:0-锁定,1-回滚中' , `gmt_create` DATETIME COMMENT '创建时间' , `gmt_modified` DATETIME COMMENT '修改时间' , PRIMARY KEY (`row_key` ), KEY `idx_status` (`status` ), KEY `idx_branch_id` (`branch_id` ), KEY `idx_xid` (`xid` ) ) ENGINE =InnoDB DEFAULT CHARSET =utf8mb4 COMMENT ='全局锁表' ; CREATE TABLE IF NOT EXISTS `distributed_lock` ( `lock_key` CHAR (20 ) NOT NULL COMMENT '锁键' , `lock_value` VARCHAR (20 ) NOT NULL COMMENT '锁值' , `expire` BIGINT COMMENT '过期时间' , PRIMARY KEY (`lock_key` ) ) ENGINE =InnoDB DEFAULT CHARSET =utf8mb4 COMMENT ='分布式锁表' ; INSERT INTO `distributed_lock` (lock_key, lock_value, expire ) VALUES ('AsyncCommitting' , ' ' , 0 ), ('RetryCommitting' , ' ' , 0 ), ('RetryRollbacking' , ' ' , 0 ), ('TxTimeoutCheck' , ' ' , 0 );
表结构说明 :
表名
作用
数据保留策略
global_table
存储全局事务信息
定期清理
branch_table
存储分支事务信息
定期清理
lock_table
存储全局锁信息
实时清理
distributed_lock
分布式锁控制
永久
4.5 启动 Seata Server 4.5.1 命令行启动 1 2 3 4 5 6 7 8 9 10 cd /opt/seata./bin/seata-server.sh -h 127.0.0.1 ./bin/seata-server.sh -p 8091 -h 192.168.1.100 nohup ./bin/seata-server.sh -h 127.0.0.1 > seata.out 2>&1 &
启动参数说明 :
-h: 绑定 IP 地址
-p: 服务端口(默认 8091)
-n: 最小线程数
-w: 最大线程数
-m: 存储模式(file/db/redis)
4.5.2 Docker 启动 1 2 3 4 5 6 7 8 docker run --name seata-server \ -d \ -p 7091:7091 \ -p 8091:8091 \ -e SEATA_IP=192.168.1.100 \ -e SEATA_PORT=8091 \ -v /opt/seata/logs:/root/logs/seata \ apache/seata-server:1.6.1
Docker Compose 配置 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 version: '3' services: seata-server: image: apache/seata-server:1.6.1 container_name: seata-server ports: - "7091:7091" - "8091:8091" environment: - SEATA_IP=192.168.1.100 - SEATA_PORT=8091 - STORE_MODE=db volumes: - ./logs:/root/logs/seata depends_on: - mysql - nacos
4.6 验证启动状态 4.6.1 查看日志 启动成功后,日志输出如下:
1 2 3 4 5 6 16:08:57.188 INFO --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 7091 (http) with context path '' 16:08:57.193 INFO --- [main] io.seata.server.ServerApplication : Started ServerApplication in 2.182 seconds 16:08:58.820 INFO --- [main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited 16:08:59.519 INFO --- [main] i.s.core.rpc.netty.NettyServerBootstrap : Server started, service listen port: 8091 16:08:59.571 INFO --- [main] com.alibaba.nacos.client.naming : initializer namespace from System Property :null 16:08:59.699 INFO --- [main] com.alibaba.nacos.client.naming : [BEAT] adding beat: BeatInfo{port=8091, ip='26.26.26.1', weight=1.0, serviceName='DEFAULT_GROUP@@seata-server', cluster='DEFAULT', metadata={}, scheduled=false, period=5000, stopped=false} to beat map.
关键信息 :
✅ Tomcat started on port(s): 7091 - 管理控制台启动成功
✅ Server started, service listen port: 8091 - 服务端口监听成功
✅ {dataSource-1} inited - 数据库连接池初始化成功
✅ [BEAT] adding beat - 已注册到 Nacos 注册中心
4.6.2 访问管理控制台 浏览器访问:http://your-ip:7091
默认账号密码 :
4.6.3 检查 Nacos 注册 登录 Nacos 控制台,查看服务列表:
服务名称:seata-server
集群:DEFAULT
健康状态:应为绿色
4.6.4 数据库验证 1 2 3 4 5 6 7 8 SHOW TABLES LIKE '%table' ;
4.7 客户端接入配置 4.7.1 Maven 依赖 1 2 3 4 5 <dependency > <groupId > com.alibaba.cloud</groupId > <artifactId > spring-cloud-starter-alibaba-seata</artifactId > <version > 2021.0.1.0</version > </dependency >
4.7.2 应用配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 seata: enabled: true tx-service-group: default_tx_group service: vgroup-mapping: default_tx_group: DEFAULT grouplist: DEFAULT: 192.168 .1 .100 :8091 registry: type: nacos nacos: server-addr: laosan.xin:8848 namespace: dev-wdg group: DEFAULT_GROUP config: type: nacos nacos: server-addr: laosan.xin:8848 namespace: dev-wdg group: DEFAULT_GROUP data-id: seataService.properties
4.7.3 开启全局事务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Service public class OrderServiceImpl { @Autowired private InventoryService inventoryService; @Autowired private AccountService accountService; @GlobalTransactional (timeoutMills = 300000 , name = "create-order-tx" ) public void createOrder (OrderDTO orderDTO) { orderMapper.insert(orderDTO); inventoryService.decreaseStock(orderDTO.getProductId(), orderDTO.getCount()); accountService.decreaseBalance(orderDTO.getUserId(), orderDTO.getAmount()); } }
五、Seata 运维指南 5.1 日常监控 5.1.1 控制台监控 访问 Seata 控制台:http://your-ip:7091
关键指标 :
📊 全局事务总数
📈 TPS (Transactions Per Second)
⏱️ 平均事务耗时
🔴 回滚事务数量
🟡 超时事务数量
5.1.2 数据库监控 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 SELECT xid, transaction_id, status , begin_time, timeout FROM global_table WHERE status IN (1 , 2 , 3 ) ORDER BY begin_time DESC ;SELECT branch_id, xid, resource_id, status , gmt_create FROM branch_table WHERE status != 4 ORDER BY gmt_create DESC ;SELECT row_key, xid, table_name, pk, gmt_create FROM lock_table ORDER BY gmt_create DESC ;SELECT status , COUNT (*) as count FROM global_table GROUP BY status ;
状态码说明 :
Status
值
说明
Begin
1
事务开始
Committing
2
提交中
Committed
3
已提交
Rollbacking
4
回滚中
Rolledback
5
已回滚
TimeoutRollbacking
6
超时回滚中
TimeoutRollbacked
7
超时已回滚
Finished
8
已结束
5.1.3 日志监控 日志位置 :
1 2 3 4 /opt/seata/logs/seata/ ├── seata-server.log # 主日志 ├── seata-server-error.log # 错误日志 └── gc.log # GC 日志
关键日志关键字 :
1 2 3 4 5 6 7 8 9 10 11 grep -i "error" seata-server.log | tail -100 grep "rollback" seata-server.log | tail -50 grep "timeout" seata-server.log | tail -50 grep "DruidDataSource" seata-server.log | grep "error"
5.2 性能优化 5.2.1 JVM 调优 1 2 3 4 5 6 7 8 9 10 JAVA_OPTS="-server \ -Xms2g -Xmx2g \ -Xmn1g \ -XX:MetaspaceSize=128m \ -XX:MaxMetaspaceSize=256m \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=100 \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=/opt/seata/logs/heapdump.hprof"
参数说明 :
-Xms/-Xmx: 堆内存大小(设置为相同值避免动态调整)
-Xmn: 新生代大小
-XX:+UseG1GC: 使用 G1 垃圾回收器
-XX:MaxGCPauseMillis: 最大 GC 停顿时间
5.2.2 数据库连接池优化 1 2 3 4 5 store: db: min-conn: 10 max-conn: 50 max-wait: 5000
优化建议 :
根据并发量调整连接池大小
监控连接池使用率(建议 < 80%)
定期检查慢查询
5.2.3 事务超时配置 1 2 3 4 5 6 client: tm: default-global-transaction-timeout: 60000 server: max-commit-retry-timeout: -1 max-rollback-retry-timeout: -1
建议 :
根据业务复杂度设置合理超时时间
避免过短导致误回滚
避免过长占用资源
5.3 故障排查 5.3.1 常见问题诊断 问题 1: 事务一直不提交
1 2 3 4 5 SELECT xid, status , begin_time, timeout FROM global_table WHERE status IN (2 , 4 ) AND gmt_modified < NOW () - INTERVAL 5 MINUTE ;
解决方案 :
检查网络是否正常
查看 RM 端日志
手动干预(慎重)
问题 2: 数据库连接不足
1 2 3 4 5 6 SHOW PROCESSLIST ;SELECT * FROM information_schema.PROCESSLIST WHERE USER = 'seata_user' ;
解决方案 :
增加数据库连接池大小
优化慢 SQL
检查是否有连接泄漏
问题 3: 全局锁等待超时
1 2 3 4 5 SELECT l.row_key, l.xid, l.table_name, l.gmt_create, TIMESTAMPDIFF (SECOND , l.gmt_create, NOW ()) as wait_seconds FROM lock_table lORDER BY wait_seconds DESC ;
解决方案 :
优化 SQL 减少锁竞争
调整事务粒度
考虑使用 TCC 模式
5.3.2 应急处理 手动提交事务 :
1 2 3 4 5 6 7 UPDATE global_table SET status = 3 , gmt_modified = NOW () WHERE xid = 'xxx' AND status = 2 ;DELETE FROM lock_table WHERE xid = 'xxx' ;
注意事项 :
⚠️ 必须在确认数据安全后操作
⚠️ 记录操作日志便于追溯
⚠️ 事后分析根本原因
5.4 数据清理 5.4.1 定期清理策略 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 DELIMITER $$ CREATE PROCEDURE cleanup_seata_history()BEGIN DELETE FROM global_table WHERE status IN (3 , 5 , 7 , 8 ) AND gmt_modified < DATE_SUB (NOW (), INTERVAL 7 DAY ); DELETE FROM branch_table WHERE branch_id NOT IN ( SELECT branch_id FROM global_table ); DELETE FROM lock_table WHERE gmt_modified < DATE_SUB (NOW (), INTERVAL 1 DAY ); END $$DELIMITER ; CREATE EVENT IF NOT EXISTS cleanup_seata_eventON SCHEDULE EVERY 1 DAY DO CALL cleanup_seata_history();
5.4.2 Undo Log 清理 1 2 3 4 server: undo: log-save-days: 7 log-delete-period: 86400000
5.5 备份恢复 5.5.1 数据备份 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/bash BACKUP_DIR="/opt/backup/seata" DATE=$(date +%Y%m%d_%H%M%S) mysqldump -h localhost -u root -p \ --databases seata \ --single-transaction \ --quick \ --lock-tables=false \ > ${BACKUP_DIR} /seata_${DATE} .sql gzip ${BACKUP_DIR} /seata_${DATE} .sql find ${BACKUP_DIR} -name "seata_*.sql.gz" -mtime +30 -delete
5.5.2 数据恢复 1 2 3 gunzip seata_20240802_120000.sql.gz mysql -h localhost -u root -p < seata_20240802_120000.sql
5.6 升级迁移 5.6.1 版本升级步骤
备份数据
1 mysqldump -u root -p seata > backup_before_upgrade.sql
停止旧版本
下载新版本
1 wget https://github.com/apache/incubator-seata/releases/download/vx.x.x/seata-server-x.x.x.tar.gz
迁移配置
1 cp old/conf/application.yml new/conf/
启动新版本
1 ./bin/seata-server.sh -h your-ip
验证功能
5.7 最佳实践总结 配置管理 ✅ 使用配置中心统一管理配置 ✅ 生产环境使用 db 存储模式 ✅ 合理设置事务超时时间 ✅ 启用 Undo Log 校验
监控告警 ✅ 部署 Prometheus + Grafana 监控 ✅ 配置关键指标告警(TPS、回滚率) ✅ 定期检查慢查询 ✅ 监控数据库连接池
安全防护 ✅ 开启 Nacos 鉴权 ✅ 数据库账号最小权限原则 ✅ 定期备份数据 ✅ 敏感配置加密存储
性能优化 ✅ JVM 参数调优 ✅ 数据库连接池优化 ✅ 合理设置线程池大小 ✅ 定期清理历史数据
故障处理 ✅ 建立完善的应急预案 ✅ 重要操作双人复核 ✅ 保留完整的操作日志 ✅ 定期进行故障演练
六、总结 Seata 作为业界领先的分布式事务解决方案,具有以下核心优势:
核心价值
零侵入 : AT 模式无需修改业务代码
高性能 : 两阶段非阻塞实现
易用性 : 一个注解开启分布式事务
可扩展 : 支持多种事务模式
生态完善 : 与主流框架无缝集成
选型建议
场景
推荐模式
理由
一般微服务
AT
开发效率最高
高并发核心
TCC
性能最优
长流程编排
Saga
灵活性最好
金融核心
XA
强一致性保障
学习路径
入门 : 理解分布式事务基本概念
上手 : 快速搭建 Demo 体验
深入 : 学习源码理解原理
实战 : 生产环境落地实践
优化 : 性能调优和故障排查
参考资料
作者 : laosan更新日期 : 2024/8/2版本 : Seata 1.6.1