分布式事务解决方案Seata 从入门到实战
一、Seata 是什么?
1.1 定义
Apache Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
- 中文名: 海塔
- 诞生时间: 2014 年(阿里巴巴内部)
- 开源时间: 2019 年
- 顶级项目: 2021 年成为 Apache 顶级项目
- GitHub: https://github.com/apache/incubator-seata
1.2 核心目标
Seata 的核心目标是解决分布式系统中的数据一致性问题,特别是在微服务架构中:
┌─────────────┐
│ 订单服务 │
└──────┬──────┘
│ 调用
▼
┌─────────────┐ ┌─────────────┐
│ 库存服务 │─────>│ 账户服务 │
└─────────────┘ └─────────────┘
│ │
▼ ▼
[库存 DB] [账户 DB]
问题:当订单创建成功后,如何保证库存扣减和账户扣款要么全部成功,要么全部失败?
答案:Seata 提供分布式事务协调能力,确保跨多个数据库的操作保持数据一致性。
1.3 三大角色
Seata 分布式事务模型包含三个核心角色:
TC (Transaction Coordinator) - 事务协调者
- 维护全局事务状态
- 协调分支事务提交或回滚
- 独立部署的服务(Seata Server)
TM (Transaction Manager) - 事务管理器
- 定义全局事务边界
- 发起全局事务的提交或回滚
- 位于业务应用的入口
RM (Resource Manager) - 资源管理器
- 管理本地资源(数据库连接)
- 执行分支事务的提交/回滚
- 向 TC 报告事务状态
TM (事务管理器)
↓ 发起全局事务
TC (事务协调者)
↙ ↘
RM1 RM2
(分支 1) (分支 2)
1.4 核心优势
✅ 零侵入: AT 模式无需修改业务代码,添加注解即可
✅ 高性能: 两阶段非阻塞实现,性能接近本地事务
✅ 多语言: 支持 Java、Go、C++ 等多种语言
✅ 多存储: 支持 MySQL、PostgreSQL、Oracle 等数据库
✅ 易扩展: 插件化设计,支持自定义扩展
✅ 生态完善: 与 Spring Cloud、Dubbo 等框架无缝集成
二、Seata 使用场景
2.1 典型应用场景
电商交易链路
场景描述: 用户下单后需要扣减库存、扣款、增加积分
用户下单
↓
@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. 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 - 三阶段补偿事务
工作原理
Try 阶段:
- 检查资源并预留
- 例如:冻结账户余额
Confirm 阶段:
- 真正使用预留资源
- 例如:扣除已冻结余额
Cancel 阶段:
- 释放预留资源
- 例如:解冻余额
优点
✅ 高性能: 无全局锁,并发度高
✅ 高可控: 业务自主控制资源预留
✅ 隔离性好: 业务层面实现资源隔离
缺点
❌ 高侵入: 需实现三个接口
❌ 开发成本高: 需处理幂等、空回滚、悬挂等问题
❌ 代码量大: 是 AT 模式的 3-5 倍
适用场景
- 高并发核心链路(如秒杀)
- 对性能要求极高的场景
- 跨语言调用场景
3.3 Saga 模式
长事务协调器 - 适用于长流程编排
工作原理
正向操作:A → B → C → D
↓ ↓ ↓ ↓
补偿操作: A' B' C' D'
任何一步失败,依次执行:C' → B' → A'
优点
✅ 适合长流程: 支持复杂的业务流程编排
✅ 灵活性强: 每个参与者可独立部署
✅ 容错性好: 支持人工介入处理
缺点
❌ 不保证隔离性: 可能丢失更新
❌ 不保证原子性: 补偿可能失败
❌ 实现复杂: 需要状态机引擎
适用场景
- 跨企业的长流程协作
- 审批流程(如贷款审批)
- 允许人工介入的场景
3.4 XA 模式
X/Open Distributed Transaction Processing - 强一致性协议
工作原理
准备阶段:
- 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
下载地址:
- GitHub Releases: https://github.com/apache/incubator-seata/releases
- 官方镜像:https://hub.docker.com/r/apache/seata-server
下载 1.6.1 版本:
# 方式 1: 直接下载 tar.gz
cd /opt
wget https://github.com/apache/incubator-seata/releases/download/v1.6.1/seata-server-1.6.1.tar.gz
# 方式 2: 使用 Docker
docker pull apache/seata-server:1.6.1
解压安装:
tar -zxvf seata-server-1.6.1.tar.gz
cd seata
目录结构:
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:
server:
port: 7091 # Seata Server 管理端口
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/file/redis
# DB 模式配置
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1: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 # Seata 服务端口(客户端连接)
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 # 校验 undo log
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 配置:
# ==================== 传输配置 ====================
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
# ==================== Undo Log 配置 ====================
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 配置 ====================
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. 创建数据库
CREATE DATABASE IF NOT EXISTS seata DEFAULT CHARACTER SET utf8mb4;
USE seata;
-- 2. 创建全局事务表
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='全局事务表';
-- 3. 创建分支事务表
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='分支事务表';
-- 4. 创建全局锁表
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='全局锁表';
-- 5. 创建分布式锁表
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='分布式锁表';
-- 6. 初始化分布式锁数据
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 命令行启动
cd /opt/seata
# 方式 1: 指定 IP 启动
./bin/seata-server.sh -h 127.0.0.1
# 方式 2: 指定端口和 IP
./bin/seata-server.sh -p 8091 -h 192.168.1.100
# 方式 3: 后台运行
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 启动
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 配置:
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 查看日志
启动成功后,日志输出如下:
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
默认账号密码:
- 用户名:
seata - 密码:
seata

4.6.3 检查 Nacos 注册
登录 Nacos 控制台,查看服务列表:
- 服务名称:
seata-server - 集群:
DEFAULT - 健康状态:应为绿色

4.6.4 数据库验证
-- 查看 Seata 表是否创建成功
SHOW TABLES LIKE '%table';
-- 应该看到以下表:
-- global_table
-- branch_table
-- lock_table
-- distributed_lock
4.7 客户端接入配置
4.7.1 Maven 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2021.0.1.0</version>
</dependency>
4.7.2 应用配置
seata:
enabled: true
tx-service-group: default_tx_group # 事务组名称
service:
vgroup-mapping:
default_tx_group: DEFAULT # 映射到 Seata 集群
grouplist:
DEFAULT: 192.168.1.100:8091 # Seata Server 地址
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 开启全局事务
@Service
public class OrderServiceImpl {
@Autowired
private InventoryService inventoryService;
@Autowired
private AccountService accountService;
@GlobalTransactional(timeoutMills = 300000, name = "create-order-tx")
public void createOrder(OrderDTO orderDTO) {
// 1. 创建订单
orderMapper.insert(orderDTO);
// 2. 扣减库存
inventoryService.decreaseStock(orderDTO.getProductId(), orderDTO.getCount());
// 3. 扣减余额
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. 查看当前活跃的全局事务
SELECT xid, transaction_id, status, begin_time, timeout
FROM global_table
WHERE status IN (1, 2, 3) -- 1:Begin, 2:Committing, 3:Rollbacking
ORDER BY begin_time DESC;
-- 2. 查看分支事务执行情况
SELECT branch_id, xid, resource_id, status, gmt_create
FROM branch_table
WHERE status != 4 -- 4:Committed
ORDER BY gmt_create DESC;
-- 3. 查看全局锁等待情况
SELECT row_key, xid, table_name, pk, gmt_create
FROM lock_table
ORDER BY gmt_create DESC;
-- 4. 统计各状态事务数量
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 日志监控
日志位置:
/opt/seata/logs/seata/
├── seata-server.log # 主日志
├── seata-server-error.log # 错误日志
└── gc.log # GC 日志
关键日志关键字:
# 查看错误日志
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 调优
# 编辑启动脚本 bin/seata-server.sh
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 数据库连接池优化
store:
db:
min-conn: 10 # 最小连接数
max-conn: 50 # 最大连接数
max-wait: 5000 # 最大等待时间 (ms)
优化建议:
- 根据并发量调整连接池大小
- 监控连接池使用率(建议 < 80%)
- 定期检查慢查询
5.2.3 事务超时配置
client:
tm:
default-global-transaction-timeout: 60000 # 默认 60 秒
server:
max-commit-retry-timeout: -1 # 提交重试超时
max-rollback-retry-timeout: -1 # 回滚重试超时
建议:
- 根据业务复杂度设置合理超时时间
- 避免过短导致误回滚
- 避免过长占用资源
5.3 故障排查
5.3.1 常见问题诊断
问题 1: 事务一直不提交
-- 查看卡住的事务
SELECT xid, status, begin_time, timeout
FROM global_table
WHERE status IN (2, 4) -- Committing 或 Rollbacking
AND gmt_modified < NOW() - INTERVAL 5 MINUTE;
解决方案:
- 检查网络是否正常
- 查看 RM 端日志
- 手动干预(慎重)
问题 2: 数据库连接不足
-- 查看当前连接数
SHOW PROCESSLIST;
-- 查看连接池状态
SELECT * FROM information_schema.PROCESSLIST
WHERE USER = 'seata_user';
解决方案:
- 增加数据库连接池大小
- 优化慢 SQL
- 检查是否有连接泄漏
问题 3: 全局锁等待超时
-- 查看锁等待
SELECT l.row_key, l.xid, l.table_name, l.gmt_create,
TIMESTAMPDIFF(SECOND, l.gmt_create, NOW()) as wait_seconds
FROM lock_table l
ORDER BY wait_seconds DESC;
解决方案:
- 优化 SQL 减少锁竞争
- 调整事务粒度
- 考虑使用 TCC 模式
5.3.2 应急处理
手动提交事务:
-- 仅用于紧急救援,需谨慎使用
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 定期清理策略
-- 创建存储过程清理历史数据
DELIMITER {mathJaxContainer[0]}
DELIMITER ;
-- 创建定时任务
CREATE EVENT IF NOT EXISTS cleanup_seata_event
ON SCHEDULE EVERY 1 DAY
DO CALL cleanup_seata_history();
5.4.2 Undo Log 清理
server:
undo:
log-save-days: 7 # 保留 7 天
log-delete-period: 86400000 # 每天清理一次
5.5 备份恢复
5.5.1 数据备份
#!/bin/bash
# backup_seata.sh
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
# 删除 30 天前的备份
find ${BACKUP_DIR} -name "seata_*.sql.gz" -mtime +30 -delete
5.5.2 数据恢复
# 恢复数据
gunzip seata_20240802_120000.sql.gz
mysql -h localhost -u root -p < seata_20240802_120000.sql
5.6 升级迁移
5.6.1 版本升级步骤
备份数据
mysqldump -u root -p seata > backup_before_upgrade.sql停止旧版本
pkill -f seata-server下载新版本
wget https://github.com/apache/incubator-seata/releases/download/vx.x.x/seata-server-x.x.x.tar.gz迁移配置
cp old/conf/application.yml new/conf/启动新版本
./bin/seata-server.sh -h your-ip验证功能
- 检查控制台访问
- 验证事务功能
- 监控日志无异常
5.7 最佳实践总结
配置管理
✅ 使用配置中心统一管理配置
✅ 生产环境使用 db 存储模式
✅ 合理设置事务超时时间
✅ 启用 Undo Log 校验
监控告警
✅ 部署 Prometheus + Grafana 监控
✅ 配置关键指标告警(TPS、回滚率)
✅ 定期检查慢查询
✅ 监控数据库连接池
安全防护
✅ 开启 Nacos 鉴权
✅ 数据库账号最小权限原则
✅ 定期备份数据
✅ 敏感配置加密存储
性能优化
✅ JVM 参数调优
✅ 数据库连接池优化
✅ 合理设置线程池大小
✅ 定期清理历史数据
故障处理
✅ 建立完善的应急预案
✅ 重要操作双人复核
✅ 保留完整的操作日志
✅ 定期进行故障演练
六、总结
Seata 作为业界领先的分布式事务解决方案,具有以下核心优势:
核心价值
- 零侵入: AT 模式无需修改业务代码
- 高性能: 两阶段非阻塞实现
- 易用性: 一个注解开启分布式事务
- 可扩展: 支持多种事务模式
- 生态完善: 与主流框架无缝集成
选型建议
| 场景 | 推荐模式 | 理由 |
|---|---|---|
| 一般微服务 | AT | 开发效率最高 |
| 高并发核心 | TCC | 性能最优 |
| 长流程编排 | Saga | 灵活性最好 |
| 金融核心 | XA | 强一致性保障 |
学习路径
- 入门: 理解分布式事务基本概念
- 上手: 快速搭建 Demo 体验
- 深入: 学习源码理解原理
- 实战: 生产环境落地实践
- 优化: 性能调优和故障排查
参考资料
- 📖 官网文档:https://seata.apache.org/
- 📦 GitHub: https://github.com/apache/incubator-seata
- 📺 视频教程:Bilibili Seata 官方频道
- 💬 社区论坛:https://github.com/apache/incubator-seata/discussions