Region 分裂时,悲观锁业务偶尔死锁回滚

高峰期 Region 频繁分裂 / 迁移,同时有大量悲观锁事务,偶尔出现 1213 deadlock,看监控是分裂时锁表迁移导致等待链异常,这种场景死锁检测要怎么调?

1 个赞
  1. 应用层捕获 1213 后自动重试(加随机退避,重试 2~3 次)。
  2. 减少悲观锁事务的持锁时间(拆小事务、避免不必要的 select for update)。
  3. 适当增加 pessimistic-txn.deadlock-detect-retry-limit(延长检测等待,但通常不推荐)。
  • 调小死锁检测间隔、缩短悲观锁等待超时,开启事务自动重试,加快死锁破环;
  • 放大 Region 分裂尺寸阈值、关闭负载型分裂、拉长分裂巡检周期,从源头减少分裂锁冲突;
  • 业务高峰压低 PD 均衡迁移速度、关停热点打散调度,减少 Region 迁移锁抢占;
  • 业务侧收紧悲观事务:拆大事务、精准索引行锁、缩短锁持有时长;低峰预分裂表分散热点 Region;
  • 错峰运维,均衡、分裂整理放到业务低流量时段执行。

一、业务侧快速优化

  1. 捕获 1213 错误,加随机退避自动重试 2-3 次
  2. 拆大事务、缩短锁持有时间,少用不必要SELECT FOR UPDATE

二、TiDB 参数调优

  1. 缩小死锁检测间隔、缩短悲观锁等待超时,开启事务自动重试
  2. 不建议盲目调大pessimistic-txn.deadlock-detect-retry-limit

三、从源头减少 Region 分裂冲突

  1. 调大 Region 分裂阈值、关闭负载型分裂、拉长分裂巡检周期
  2. 高峰压低 PD 迁移均衡速度,关停热点打散调度
  3. 低流量时段做分裂、迁移、运维操作,错峰规避冲突

优先管控 Region 调度节奏,再调整死锁检测参数减少异常回滚。

  • 开启内存悲观锁,锁不加 Raft,大幅降 Raftstore CPU
  • 关闭公平锁,避免队列阻塞
  • 拆小事务、禁用 SELECT FOR UPDATE 大查询
  • 热点行分片打散,从根源消除锁竞争

调小死锁检测间隔、缩短悲观锁等待超时

可以问AI,可以解决大部分基础问题

分库分表迁移注意全局唯一ID生成方式。

SQL兼容性和执行计划生成机制相关,同样SQL优化器决策可能不同。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。