# 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

```bash
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. 初始化数据库

```bash
# 创建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配置：

```yaml
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` 注解：

```java
@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模式原理

1. **分支事务注册**：微服务在执行本地事务前，向TC注册分支事务
2. **undo_log记录**：在执行SQL前记录数据前后镜像
3. **本地事务提交**：SQL与undo_log在同一事务中提交
4. **全局事务完成**：TM通知TC提交/回滚全局事务
5. **分支回滚/删除**：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`：
```yaml
SEATA_SERVER_MODE: cluster
```

### 外部注册中心
修改 `config/registry.conf` 使用Nacos/ZK等：
```conf
registry {
  type = "nacos"
  nacos {
    serverAddr = "127.0.0.1:8848"
    cluster = "default"
  }
}
```

## 故障恢复

### 查看事务状态
```bash
curl http://localhost:7091/v1/transaction/global/query?xid=your-xid
```

### 强制回滚
```bash
curl -X PUT http://localhost:7091/v1/transaction/global/rollback -d '{"xid":"your-xid"}'
```

### 强制提交
```bash
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保留天数 |
