5.4 KiB
5.4 KiB
Seata 分布式事务配置
概述
本目录包含Seata分布式事务的完整配置和示例代码,用于ERP系统的分布式事务管理。
技术栈
- Seata Server 1.8.0
- Spring Cloud Alibaba Seata
- Docker Compose
- MySQL 8.0
- Prometheus + Grafana 监控
目录结构
seata/
├── server/ # Seata Server部署配置
│ ├── docker-compose.yml # Docker Compose配置
│ └── config/ # Seata配置文件
│ ├── registry.conf # 注册中心配置
│ └── file.conf # 存储和客户端配置
├── client/ # Seata客户端配置
│ ├── seata.yml # 通用Seata配置
│ ├── order-service/ # 订单服务配置
│ ├── inventory-service/ # 库存服务配置
│ └── finance-service/ # 财务服务配置
├── sql/ # 数据库脚本
│ ├── store.sql # Seata存储库表
│ ├── undo_log.sql # AT模式undo_log表
│ └── business_tables.sql # 业务表结构
├── example/ # 分布式事务示例
│ ├── GlobalTransactionalExample.java # 全局事务示例
│ ├── OrderService.java # 订单服务
│ ├── InventoryService.java # 库存服务
│ ├── FinanceService.java # 财务服务
│ ├── entity/ # 实体类
│ └── mapper/ # Mapper接口
└── monitoring/ # 监控配置
├── prometheus.yml # Prometheus配置
└── grafana/ # Grafana配置
快速开始
1. 启动Seata Server
cd /root/.openclaw/workspace/erp-java-backend/seata/server
docker-compose up -d
启动后服务端口:
- Seata Server: 8091 (事务处理), 7091 (控制台)
- Seata MySQL: 3306
- Prometheus: 9090
- Grafana: 3000 (admin/admin123)
2. 初始化数据库
# 创建Seata存储库
mysql -h localhost -u root -proot123 < ../sql/store.sql
# 在业务库创建undo_log表
mysql -h localhost -u root -proot123 order_db < ../sql/undo_log.sql
mysql -h localhost -u root -proot123 inventory_db < ../sql/undo_log.sql
mysql -h localhost -u root -proot123 finance_db < ../sql/undo_log.sql
# 创建业务表
mysql -h localhost -u root -proot123 < ../sql/business_tables.sql
3. 配置微服务
在各微服务的 application.yml 中添加Seata配置:
seata:
enabled: true
tx-service-group: default_tx_group
service:
vgroup-mapping:
default_tx_group: default
grouplist:
default: 127.0.0.1:8091
4. 使用分布式事务
在需要分布式事务的方法上添加 @GlobalTransactional 注解:
@GlobalTransactional(name = "create-order-transaction", timeoutMills = 30000, rollbackFor = Exception.class)
public String createOrder(Long customerId, Long productId, Integer quantity) {
// 创建订单
String orderNo = orderService.createOrder(customerId, productId, quantity);
// 扣减库存
inventoryService.reserveStock(productId, quantity, orderNo);
// 扣减余额
financeService.freezeAmount(customerId, amount, orderNo);
return orderNo;
}
AT模式原理
- 分支事务注册:微服务在执行本地事务前,向TC注册分支事务
- undo_log记录:在执行SQL前记录数据前后镜像
- 本地事务提交:SQL与undo_log在同一事务中提交
- 全局事务完成:TM通知TC提交/回滚全局事务
- 分支回滚/删除:TC驱动各分支根据undo_log回滚或删除undo_log
监控
Prometheus指标
seata_server_transactions_total- 事务总数seata_server_branch_transaction_total- 分支事务总数seata_server_lock_keys_count- 全局锁数量seata_server_heartbeat_timestamp- 心跳时间戳
Grafana Dashboard
访问 http://localhost:3000 查看Seata监控面板
高可用配置
集群模式
修改 docker-compose.yml 中的 SEATA_SERVER_MODE:
SEATA_SERVER_MODE: cluster
外部注册中心
修改 config/registry.conf 使用Nacos/ZK等:
registry {
type = "nacos"
nacos {
serverAddr = "127.0.0.1:8848"
cluster = "default"
}
}
故障恢复
查看事务状态
curl http://localhost:7091/v1/transaction/global/query?xid=your-xid
强制回滚
curl -X PUT http://localhost:7091/v1/transaction/global/rollback -d '{"xid":"your-xid"}'
强制提交
curl -X PUT http://localhost:7091/v1/transaction/global/commit -d '{"xid":"your-xid"}'
常见问题
1. 事务超时
默认超时时间60秒,可在 @GlobalTransactional(timeoutMills = 30000) 修改
2. 脏数据清理
undo_log保留7天,通过 undoLogRetentionDays 配置
3. 锁等待
锁重试间隔30ms,最多重试100次,可通过 lock-retry-interval 和 lock-retry-times 调整
配置参数
| 参数 | 默认值 | 说明 |
|---|---|---|
global-session-timeout |
60000 | 全局事务超时(ms) |
async-commit-timeout |
10000 | 异步提交超时(ms) |
lock-retry-interval |
30 | 锁重试间隔(ms) |
lock-retry-times |
100 | 锁重试次数 |
commit-retry-count |
5 | 提交重试次数 |
rollback-retry-count |
5 | 回滚重试次数 |
undo-log-retention-days |
7 | undo_log保留天数 |