[Seata分布式事务集成参考.md](Seata%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E9%9B%86%E6%88%90%E5%8F%82%E8%80%83.md)# Seata 分布式事务集成参考

## 一、架构说明

### 多环境 Seata 配置管理

所有环境的 Seata 配置统一通过 Nacos 管理，本地配置文件不包含 Seata 配置。

```
├── dev 环境:   base-server-dev.yaml (dev_tx_group, namespace: dev)
├── test 环境:  base-server-test.yaml (test_tx_group, namespace: test)
└── prod 环境:  base-server-prod.yaml (prod_tx_group, namespace: prod)

Seata Server: 172.16.46.63:30088
```

### 为什么使用 IP 直连？

Nacos 的 namespace 隔离机制导致不同命名空间的应用无法跨 namespace 发现服务。Seata Server 通过 IP 直连（`registry.type=file`）避免此限制，所有环境共享同一个 Seata Server，通过不同的 `tx-service-group` 实现逻辑隔离。

---

## 二、Nacos 配置

在对应环境的 Nacos 配置中心创建配置文件。以 `base-server-dev.yaml` 为例（其他环境只需修改 `tx-service-group`）：

```yaml
seata:
  enabled: true
  application-id: base-server
  tx-service-group: dev_tx_group
  enable-auto-data-source-proxy: true
  data-source-proxy-mode: AT
  registry:
    type: file
  config:
    type: file
  service:
    vgroupMapping:
      default_tx_group: default
      dev_tx_group: default
      test_tx_group: default
      prod_tx_group: default
    default:
      grouplist: 172.16.46.63:30088
  client:
    tm:
      defaultGlobalTransactionTimeout: 60000
    undo:
      logTable: undo_log
      dataValidation: true
      logSerialization: jackson
```

---

## 三、业务集成步骤

### 步骤 1：在 pom.xml 中添加依赖

Seata 2.4.0 版本已在 `zt-dependencies` 中统一管理。业务模块只需在 `pom.xml` 中添加：

```xml
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
</dependency>
```

版本号会从 `zt-dependencies` 继承。

### 步骤 2：创建 undo_log 表

在业务数据库执行：

```sql
CREATE TABLE "UNDO_LOG" (
    "BRANCH_ID"     BIGINT       NOT NULL,
    "XID"           VARCHAR(128) NOT NULL,
    "CONTEXT"       VARCHAR(128) NOT NULL,
    "ROLLBACK_INFO" BLOB         NOT NULL,
    "LOG_STATUS"    INT          NOT NULL,
    "LOG_CREATED"   DATETIME     DEFAULT SYSDATE,
    "LOG_MODIFIED"  DATETIME     DEFAULT SYSDATE,
    PRIMARY KEY ("BRANCH_ID")
);

CREATE UNIQUE INDEX "UX_UNDO_LOG" ON "UNDO_LOG" ("XID", "BRANCH_ID");
```

### 步骤 3：在 Service 方法上添加 @GlobalTransactional 注解

```java
import io.seata.spring.annotation.GlobalTransactional;

@Service
public class OrderServiceImpl implements OrderService {

    @GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
    @Override
    public Long createOrder(OrderCreateReqVO req) {
        // 本地操作
        orderMapper.insert(order);

        // 跨服务调用自动参与分布式事务
        inventoryApi.deduct(productId, quantity);

        return order.getId();
    }
}
```

**说明**:
- 只在事务发起方添加注解
- 被调用的其他服务自动参与，无需额外配置
- Seata 自动通过 HTTP Header 传递事务 ID

---

## 四、配置汇总

| 配置项 | 开发环境 | 测试环境 | 生产环境 |
|--------|---------|---------|---------|
| **tx-service-group** | `dev_tx_group` | `test_tx_group` | `prod_tx_group` |
| **Nacos 命名空间** | `hwc` | `test` | `prod` |
| **Seata Server** | `172.16.46.63:30088` | `172.16.46.63:30088` | `172.16.46.63:30088` |

---

## 五、其他事务模式

当前配置默认使用 **AT 模式**（自动事务模式）。Seata 还支持其他事务模式，需要业务自己实现：

### TCC 模式

需要实现 Try、Confirm、Cancel 三个业务方法，使用 `@TwoPhaseBusinessAction` 注解标记。详见官方文档。

### Saga 模式

需要定义 Saga 流程和状态机。详见官方文档。

### XA 模式

需要数据库支持 XA 事务，配置中修改 `data-source-proxy-mode: XA`。

**详见**: https://seata.apache.org/zh-cn/docs/overview/what-is-seata

---

## 六、Seata 控制台

**地址**: `http://172.16.46.63:30087`

可查看全局事务、分支事务、全局锁等监控信息。

---

**官方文档**: https://seata.apache.org/zh-cn/docs/overview/what-is-seata
