高峰期 Region 频繁分裂 / 迁移,同时有大量悲观锁事务,偶尔出现 1213 deadlock,看监控是分裂时锁表迁移导致等待链异常,这种场景死锁检测要怎么调?
1 个赞
- 应用层捕获 1213 后自动重试(加随机退避,重试 2~3 次)。
- 减少悲观锁事务的持锁时间(拆小事务、避免不必要的 select for update)。
- 适当增加
pessimistic-txn.deadlock-detect-retry-limit(延长检测等待,但通常不推荐)。
- 调小死锁检测间隔、缩短悲观锁等待超时,开启事务自动重试,加快死锁破环;
- 放大 Region 分裂尺寸阈值、关闭负载型分裂、拉长分裂巡检周期,从源头减少分裂锁冲突;
- 业务高峰压低 PD 均衡迁移速度、关停热点打散调度,减少 Region 迁移锁抢占;
- 业务侧收紧悲观事务:拆大事务、精准索引行锁、缩短锁持有时长;低峰预分裂表分散热点 Region;
- 错峰运维,均衡、分裂整理放到业务低流量时段执行。
一、业务侧快速优化
- 捕获 1213 错误,加随机退避自动重试 2-3 次
- 拆大事务、缩短锁持有时间,少用不必要
SELECT FOR UPDATE
二、TiDB 参数调优
- 缩小死锁检测间隔、缩短悲观锁等待超时,开启事务自动重试
- 不建议盲目调大
pessimistic-txn.deadlock-detect-retry-limit
三、从源头减少 Region 分裂冲突
- 调大 Region 分裂阈值、关闭负载型分裂、拉长分裂巡检周期
- 高峰压低 PD 迁移均衡速度,关停热点打散调度
- 低流量时段做分裂、迁移、运维操作,错峰规避冲突
优先管控 Region 调度节奏,再调整死锁检测参数减少异常回滚。
- 开启内存悲观锁,锁不加 Raft,大幅降 Raftstore CPU
- 关闭公平锁,避免队列阻塞
- 拆小事务、禁用 SELECT FOR UPDATE 大查询
- 热点行分片打散,从根源消除锁竞争
调小死锁检测间隔、缩短悲观锁等待超时
可以问AI,可以解决大部分基础问题
分库分表迁移注意全局唯一ID生成方式。
SQL兼容性和执行计划生成机制相关,同样SQL优化器决策可能不同。
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。