Seata AT/XA/TCC/TC 恢复真实实验(U38)
公开入口,仓库根目录,JDK 21 / Maven 3.9 / Python 3;使用真实 seata-server 2.5.0 发行版进程(store.mode=db,端口 18091)+ 本机 MySQL 8.4.7(DBngin):
python3 labs/seata/run.py前置:seata-server 2.5.0 发行包解压在仓库外缓存 ~/.cache/software-engineering-study/java-depth-impl/u38/dist/extracted-bin/apache-seata-2.5.0-incubating-bin/seata-server(U38_SEATA_SERVER_DIR 可覆盖;官方 sha512 校验);本机 MySQL 可连接(root/空密码)。缺失时脚本如实报错退出,不降级为 mock。
实验会启动 Seata 服务,先取得本机用户同意。Maven 在离线模式运行,依赖缺失时需先获准准备本地缓存。具体环境、输入、结果及清理状态见运行证据。
Seata 2.5.0 原版 RPC 默认监听所有接口;实验通过 loopback agent 仅把绑定地址改为 127.0.0.1,保留事务实现,并在启动时核对类文件与实际监听地址。运行证据须注明这个差异。
工程按客户端形态分两个 Maven 模块:core 用 seata-all 2.5.0 编程式 API(AT/XA/TC 恢复,无 Spring 上下文);starter 用 seata-spring-boot-starter 2.5.0 + Boot 2.7.18(Seata 2.5.0 官方构建基线,上游 build/pom.xml:84-85)承载 TCC fence(SpringFenceHandler)与 @GlobalTransactional 用例。SCA spring-cloud-starter-alibaba-seata 2025.1.0.0 仅做依赖解析(-Psca),不实跑。
server 进程由测试 JVM(study.seata.Harness)按官方方式启动(-Dloader.path=发行包lib,-p 18091,堆 64m–128m,限制可用处理器数为 2),以随机后缀创建 study_u38_tc_* 和 study_u38_biz_* 数据库,结束后 JVM shutdown hook 停进程并仅删除本次创建的库。runner 检查清理结果、端口与日志。
教材:Seata:AT、TCC、XA 与 TC 恢复的 2.5.0 实现边界。协议层教学模型见 跨资源事务与长流程,Outbox 对照见 Outbox、事务消息与最终一致性。
公开工程:runner、父 POM、core POM、starter POM、Harness、AT 测试、XA 测试、TC 恢复测试、TCC fence 测试、starter 测试、TC 建表 SQL。
| 测试(模块) | 证明 |
|---|---|
| atCommitRollbackUndoLog(core) | AT 提交/回滚:undo_log 前后镜像 JSON 形状、二阶段异步删除、global_table 状态迁移 |
| atGlobalLockConflict(core) | 并发两全局事务写同行:selectForUpdate 重试后成功;50×100ms 预算耗尽 LockWaitTimeoutException |
| atTimeoutAutoRollback(core) | 全局超时后 TC timeoutCheck→TimeoutRollbacking 自动补偿,前镜像恢复 |
| atDirtyWriteUnretriable(core) | 超时回滚遇外部脏写:SQLUndoDirtyException→Unretriable,数据保持外部修改值,undo_log 不删 |
| xaCommitRollbackIsolation(core) | XA prepare 期间快照读不可见 + 行锁阻塞新写入;commit/rollback 二阶段真实生效 |
| tcRestartRecoversPendingRollback(core) | kill -9 TC 后重启:从 global_table 恢复 Begin+超时会话并驱动 undo_log 补偿 |
| tccFenceProtocol(starter) | fence 四状态真实 tcc_fence_log:TRIED→COMMITTED/ROLLBACKED、重复确认幂等、空回滚 SUSPENDED 墓碑、防悬挂拒绝迟到 Try |
| starterGlobalTransactional(starter) | starter 数据源自动代理 + @GlobalTransactional 真实回滚 |
边界
- TC 为单机发行版进程(store.mode=db,端口 18091);无注册中心、无多 TC 集群、无 raft/Redis store。
- SAGA 状态机引擎、namingserver、生产参数调优为推演,未运行。
- starter 用例运行在 Seata 官方构建基线 Boot 2.7.18;课程 Boot 4.0.9 与 Seata 2.5.0 组合未运行,兼容性无官方证据。
- SCA starter 仅依赖解析;主从/断电级恢复(kill -9 仅进程级)与生产容量不在证明范围。
- 只使用 127.0.0.1、临时目录与
study_u38_*专用库;结束停进程、删库、复核端口与进程清零。