# ttm
**Repository Path**: gzcltech/ttm
## Basic Information
- **Project Name**: ttm
- **Description**: 多线程事务
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-23
- **Last Updated**: 2026-06-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# TTM(Transactional Transaction Manager)
多线程、进程内分布式事务协调框架,语义对齐 [DTM](https://github.com/dtm-labs/dtm),支持 **TCC**、**Saga**、**Msg**(二阶段消息),存储可选 **SQL** / **Redis**。
## 技术栈
- Java 25
- Spring Boot 4.0.6
- Spring Integration 7.0.4(Client ↔ Server 通信)
- Gson、JobRunr 8.6.0
- Maven 多模块
## 模块
| 模块 | 说明 |
|------|------|
| `parent` | 父 POM,统一依赖版本(Boot / SI / Gson / JobRunr 等) |
| `ttm-core` | 领域模型、Channel 常量、`SagaStep` 等 |
| `ttm-storage-api` / `ttm-storage-jdbc` / `ttm-storage-redis` | 协调器与屏障存储 |
| `ttm-barrier` | 分支幂等屏障 |
| `ttm-server` | 协调器(Msg/Saga/TCC Processor) |
| `ttm-client` | 客户端 API、注解 |
| `ttm-client-processor` | 编译期分支注册表 APT |
| `ttm-spring-boot-starter` | 自动配置,Server 与 Client 同 JVM 嵌入 |
| `ttm-examples-transfer` | 转账示例(TCC / Saga / Msg) |
## 快速开始
```bash
# 构建
mvn -Dspotless.check.skip=true verify
# 运行转账示例
mvn -pl ttm-examples-transfer -Dspotless.check.skip=true spring-boot:run
```
### Maven APT(分支注解)
应用模块需声明 `ttm-client-processor`,并启用父 POM 的 **`ttm-apt` Maven Profile**(示例模块默认已激活):
```xml
io.gitee.gzcltech.ttm
ttm-client-processor
provided
```
```xml
ttm-apt
true
```
或命令行:`mvn -Pttm-apt compile`
`@EnableTtm` 启动后,`TtmHandlerRegistrar` 会自动加载 APT 生成的 `GeneratedTtmBranchRegistry`。
### 配置示例(`application.yml`)
```yaml
ttm:
enabled: true
store:
type: sql # 或 redis
redis-url: redis://127.0.0.1:6379
pool: # Redis 时 Lettuce 连接池(ttm-storage-redis)
max-total: 8
max-idle: 8
min-idle: 0
skip-locked: true # MySQL / PostgreSQL 恢复抢锁 FOR UPDATE SKIP LOCKED
dispatch:
receive-timeout: 30s
direct: true # 同 JVM 直调 Registry,绕过 SI(嵌入式推荐,默认开启)
recovery:
enabled: true # 需 JobRunr background-job-server
lease: 30s
scan-batch: 32 # Redis LOCK_ONE 每轮扫描上限
scheduler:
poll-interval: 1s
worker-threads: 8 # 每 tick 并行抢锁条数
strict-options: false # true 时损坏的 options JSON 启动/加载即失败
client: # 注入 TtmTemplate 的默认 TransOptions
wait-result: true
timeout-to-fail: 0
request-timeout: 0 # 0 表示沿用 dispatch.receive-timeout
branch-core-size: 4 # Saga 同层并发线程池 core
branch-max-size: 16 # Saga 同层并发线程池 max
jobrunr:
background-job-server:
enabled: true
```
Starter 会在 `TtmAutoConfiguration` 中注册 `jobRunrJsonMapper`(`GsonJsonMapper`),JobRunr 任务序列化与 TTM 一致使用 Gson(覆盖 classpath 上 Jackson 的自动探测)。
`submit` / `submitSaga` / `abort` 经 Spring Integration **sendAndReceive** 同步返回 `CoordinatorResult`(`gid` + `status`)。`TtmTemplate.tcc/saga/msg` 同样返回该类型,可用 `requireSucceed()` 断言成功。
## 使用示例
```java
@EnableTtm
@SpringBootApplication
public class App { }
@TransCatalog(value = "TransferBranches", prefix = "transfer")
@Service
public class AccountService {
@DefineTcc(name = "FREEZE")
public void freeze(TransferReq req) { ... }
public void confirmFreeze(TransferReq req) { ... }
public void cancelFreeze(TransferReq req) { ... }
}
// APT 生成 TransferBranches.FREEZE
CoordinatorResult result = ttmTemplate.tcc(tx -> TransferBranches.FREEZE.call(tx, req));
result.requireSucceed();
```
Saga(推荐 `TtmTemplate.saga` + APT 常量):
```java
ttmTemplate.saga(builder -> builder
.add(TransferBranches.TRANS_OUT, req)
.add(TransferBranches.TRANS_IN, req)
.addBranchOrder("02", List.of("01"))
.setConcurrent()
.submit());
```
Saga 同层并行见 `TransferSagaService.transferConcurrent()`。
**并行层语义**:同层并行时,一个分支失败可能导致同层其它分支已 SUCCESS,协调器会对已完成 action 执行 compensate(非层内 2PC)。默认 `failFastOnBranchFailure` 会取消同层未完成任务;若要求「任一分支失败则同层不得执行」,请用串行 Saga 或 `addBranchOrder` 拆层。详见 [Saga 并行层语义](docs/saga-parallel-semantics.md)。
### TransOptions
| 字段 | 说明 |
|------|------|
| `waitResult` | 默认 `true`:submit 后同步跑完 Processor;`false` 则仅置 `submitted` 由 JobRunr 恢复 |
| `timeoutToFail` | 全局失败截止时间(毫秒) |
| `concurrent` | Saga 层内并行(也可 `SagaBuilder.setConcurrent()`) |
| `requestTimeout` | 单分支派发超时(毫秒),0 用 `ttm.dispatch.receive-timeout` |
| `failFastOnBranchFailure` | TCC/Msg 标全局 `failed`;Saga 并行层取消未完成任务(已成功 action 靠补偿,见 [文档](docs/saga-parallel-semantics.md)) |
全局默认可通过 `ttm.client.*` 配置;也可链式覆盖:
```java
ttmTemplate.options(new TransOptions(false, 0, false, 0, 0, Map.of(), null))
.tcc(tx -> tx.callBranch(...)); // waitResult=false → 异步由 JobRunr 推进
```
TCC **Try** 与 Msg 本地业务走 `BranchBarrier`(需 `BarrierStore`),重复 Try 幂等跳过业务。
完整示例见 `ttm-examples-transfer`。
## 数据库 DDL
| 方言 | 脚本路径 |
|------|----------|
| MySQL | `ttm-storage-jdbc/src/main/resources/sql/mysql/schema.sql` |
| PostgreSQL | `ttm-storage-jdbc/src/main/resources/sql/postgresql/schema.sql` |
配置 Spring DataSource 指向对应库后,Starter 会根据 JDBC URL 自动选择方言(`jdbc:postgresql:` / `jdbc:postgres:`)。
```yaml
spring:
datasource:
url: jdbc:postgresql://127.0.0.1:5432/ttm
driver-class-name: org.postgresql.Driver
username: ttm
password: ttm
```
## 初始化 JobRunr
JobRunr 的 `jobrunr_backgroundjobservers.firstHeartbeat` / `lastHeartbeat` 等字段类型为 **DATETIME(6)**,驱动层用 **UTC** 读写(见 JobRunr `Dialect#setTimestamp`)。请让 Spring DataSource 的 MySQL 连接使用 **UTC 会话**,与 [JobRunr 文档](https://www.jobrunr.io/en/documentation/installation/storage/) 一致,例如:
```yaml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/ttm?connectionTimeZone=UTC&forceConnectionTimeZoneToSession=true&...
```
若 URL 使用 `serverTimezone=Asia/Shanghai` 等非 UTC 时区,库里心跳时间会与本地墙钟相差约 8 小时,或引发超时误判。表中时间为 **UTC 墙上时钟**;在 SQL 客户端按东八区展示可用:
```sql
SELECT id,
CONVERT_TZ(firstHeartbeat, '+00:00', '+08:00') AS firstHeartbeat_cst,
CONVERT_TZ(lastHeartbeat, '+00:00', '+08:00') AS lastHeartbeat_cst
FROM jobrunr_backgroundjobservers;
```
```shell
# MySQL
java -cp jobrunr-8.6.0.jar org.jobrunr.storage.sql.common.DatabaseCreator \
"jdbc:mysql://127.0.0.1:3306/ttm?connectionTimeZone=UTC&forceConnectionTimeZoneToSession=true&..." root password
# PostgreSQL
java -cp jobrunr-8.6.0.jar org.jobrunr.storage.sql.common.DatabaseCreator \
"jdbc:postgresql://127.0.0.1:5432/ttm" ttm ttm
```
## 设计文档
- [分支派发:直调与 SI 共存](docs/dispatch-modes.md)
- [运维 API(人工介入)](docs/ops-api.md)
- [Saga 并行层语义](docs/saga-parallel-semantics.md)
- [设计规格](docs/superpowers/specs/2026-05-23-ttm-distributed-transaction-design.md)
- [实现计划](docs/superpowers/plans/2026-05-23-ttm-distributed-transaction.md)
## 作者
gzcltech