tp6本身不提供分布式事务插件,所谓“tp分布式事务”是业务层逻辑组合,非composer可安装的通用包;官方从未发布标称该功能的独立包,所有相关搜索结果多为伪包、混搭包或私有仓库。

TP6 本身不提供“分布式事务插件”,所谓“TP 分布式事务”是业务层逻辑组合,不是 composer require 就能装出来的功能;强行找 thinkphp/distributed-transaction 这类包,99% 是不存在或已失效的。
为什么搜不到靠谱的 TP 分布式事务 Composer 包
ThinkPHP 官方从未发布过标称“分布式事务”的独立 Composer 包。你看到的所谓“tp 分布式事务插件”,基本分三类:
- 名字唬人、实际只是封装了本地事务嵌套(
Db::transaction())或手动写两阶段提交伪代码的玩具包 - 把 Laravel 的
laravel/framework里DB::transaction()改名硬塞进 TP6 autoload 的混搭包,运行时 Class not found 或方法缺失 - 基于 Swoole + Redis 实现的简易补偿逻辑(如
think-swoole生态里的某个私有仓库),但没上 Packagist,也无文档,composer require直接报Could not find package
根本原因:分布式事务涉及跨服务、跨网络、超时控制、日志持久化、重试策略——这些必须和你的业务架构强绑定,没法抽象成一个通用 Composer 包。
TP6 多数据库一致性靠什么落地
真正在 TP6 项目中保障多库写一致,核心不是装包,而是设计好三层控制点:
-
应用层事务边界:用
Db::transaction()包住同库多表操作;跨库操作必须拆成“本地事务 + 补偿动作”,不能依赖单一begin/commit -
消息中间件兜底:写完主库后发 MQ(如 RabbitMQ/Redis Stream),下游服务消费后更新从库;失败走死信队列人工干预,而不是指望
require thinkphp/rabbitmq-plugin -
状态表 + 定时核对:关键业务表旁加
_status字段记录各库同步状态,用php think timer:check定时扫描不一致记录并触发修复
所有这些,都不需要额外 Composer 包——TP6 自带 think-queue(需 composer require topthink/think-queue)、think-cache、think-log 已足够支撑。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
哪些 Composer 命令看似相关实则误导
以下命令在搜索“TP 分布式事务”时高频出现,但要么无效,要么危险:
-
composer require topthink/think-distributed→ 不存在,Packagist 返回 404 -
composer require easyswoole/redis→ 装的是 EasySwoole 的 Redis 客户端,和 TP6 事务无直接关系,且与topthink/think-swoole存在 autoload 冲突 -
composer require "alibabacloud/pop-core"→ 阿里云 OpenAPI SDK,用来调用阿里云 DTS 或 RocketMQ,不是 TP6 插件,装了也不会自动接入事务流 -
composer update --with-dependencies→ 强制刷新整个依赖树,可能意外升级topthink/framework到 6.4+(当前稳定版仍是 6.3.10),引发Connection::beginTransaction()行为变更
真正该跑的只有:composer require topthink/think-queue(配好驱动后可用)和 composer require psr/log(统一日志接口,方便追踪补偿链路)。
最容易被忽略的执行细节
即使你手写了完整的 TCC(Try-Confirm-Cancel)逻辑,下面三点不处理,事务链就断在第一步:
-
.env中QUEUE_CONNECTION=redis必须生效,且REDIS_HOST可达——否则Job::dispatch()看似成功,其实消息根本没进队列 - 所有补偿方法(如
cancelOrder())必须声明为 public static,且不能依赖$this->app—— 队列 Worker 是新进程,App 实例未初始化 - TP6 的
runtime/log默认按天切文件,但补偿任务失败日志若只打在2026-05-20.log里,而你查的是2026-05-19.log,就会误判“没失败”
没有银弹包,只有可验证的日志、可重放的补偿接口、和每次 deploy 后必跑的 php think queue:restart。










