webman 连 tidb 需禁用 pdo 模拟预处理、关闭自动事务重试、拆分连接超时、避免 on duplicate key update 大批量写入,并对齐协程调度与 tidb region 分布模型。

Webman 本身不提供 TiDB 集成层,直接用 PDO 或 mysqli 连 TiDB 是可行的,但高并发写入、连接池、事务一致性等关键问题必须手动兜底——否则一到百万级 QPS 就崩。
Webman 连 TiDB 时 PDO 配置容易漏掉的关键项
TiDB 兼容 MySQL 协议,但不是 MySQL。很多 Webman 项目直接复用旧的 MySQL PDO 配置,结果在长事务、大结果集或高并发下出错。
-
PDO::ATTR_EMULATE_PREPARES必须设为false:TiDB 的 prepare 语句支持较弱,开启模拟预处理会导致类型推断错误,尤其在JSON或DECIMAL字段上返回空或截断 -
PDO::MYSQL_ATTR_INIT_COMMAND建议设为"SET tidb_txn_mode='optimistic'":避免悲观锁阻塞,尤其在 Webman 的协程模型下,锁等待会拖垮整个 worker - 连接超时要拆开设:
connect_timeout=3、read_timeout=10、write_timeout=10—— TiDB PD 调度延迟可能让 connect 等很久,但 read/write 不该卡死整个协程 - 禁用
PDO::ATTR_PERSISTENT:Webman 的常驻进程 + 协程模型下,持久连接会引发连接状态错乱(如事务未提交残留、字符集污染)
Webman 多协程场景下 tidb_disable_txn_auto_retry 必须关
Webman 默认启用协程,一个请求可能跨多个协程调度。TiDB 默认开启自动事务重试(tidb_disable_txn_auto_retry=OFF),但在协程切换时,重试逻辑可能丢失上下文,导致部分 SQL 执行两次或丢数据。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 在连接 DSN 后加
&tidb_disable_txn_auto_retry=1显式关闭自动重试 - 业务层改用显式
BEGIN/COMMIT/ROLLBACK,并在 catch 中判断errno是否为9007(事务冲突)再决定是否重试 - 不要依赖
tidb_retry_limit:它的重试是内部机制,无法感知 Webman 协程生命周期,容易在重试中途被 scheduler 切走
Webman 写入超大规模表时绕不开 INSERT ... ON DUPLICATE KEY UPDATE 的坑
TiDB 对 INSERT ... ON DUPLICATE KEY UPDATE 的执行计划不稳定,尤其在分库分表或二级索引多的场景下,极易触发全表扫描或 Region 分裂抖动。
- 避免在单条语句中更新超过 100 行:TiDB 的
batch-dml已废弃,强行批量 upsert 会撑爆内存或触发txn-total-size-limit - 改用
REPLACE INTO前务必确认主键/唯一键无业务语义依赖——TiDB 的REPLACE是先删后插,会丢失自增 ID 和触发器行为 - 高频写入场景优先走
TiCDC+ Kafka 消费写入,Webman 只负责发消息;直接写 TiDB 应配合tidb_enable_async_commit=1和tidb_enable_1pc=1(需 v6.5+)降低延迟
Webman 日志里出现 region is unavailable 时的真实原因
这不是网络问题,而是 Webman worker 协程在等待 TiKV 返回 region 路由时被挂起太久,PD 没来得及响应,TiDB 层就主动报错。
- 检查
pd.enable-follower-handle-region是否开启(TiDB v8.5+ 默认开):没开的话所有 region 查询都压 PD leader,QPS 上千就扛不住 - Webman 的
max_connections不宜设过高:TiDB 默认max-server-connections=0(不限制),但每个连接都要维持 region 缓存,worker 数 × 连接数 > 200 时缓存爆炸 - 临时缓解可加
&timeout=30到 DSN,但治标不治本;长期方案是用pingcap/tidb-sql-parser在 Webman 中间件层做简单 SQL 路由预判,避开热点 region
真正难的不是连上 TiDB,而是让 Webman 的协程调度、连接复用、错误恢复和 TiDB 的 region 分布、PD 负载、事务模型对齐——这些细节不抠清楚,集群规模一上去,监控图里全是锯齿和毛刺。










