悲观锁模式

悲观锁模式下,TiDB 锁等待队列与 Region 分裂 / 迁移并发时,死锁检测实现原理?

1 个赞

悲观锁全局单节点集中死锁检测 + Region 变更先冻结锁队列、迁移 / 分裂同步迁移等待依赖、旧 Region 路由失效自动刷新,规避分区变动造成等待图断裂误判死锁。

1 个赞

悲观锁依托 Region 本地锁管理器维护等待队列、全集群统一检测器汇总等待边做环路死锁判断,Region 分裂迁移时暂停新上锁、完整迁移锁与等待队列并重新上报依赖、旧依赖临时保留,辅以锁超时机制,保障调度期间不漏判、不误判死锁。

1 个赞

从 MySQL 迁到 TiDB,如果原来用了自增主键,高并发下会产生写入热点,因为所有写操作都集中在同一个 Region。建议评估下改成 AUTO_RANDOM 或者业务自己生成分布式ID,利用 TiDB 的 Region 自动拆分机制提高写入吞吐。

1 个赞

TiDB 的悲观锁和死锁检测机制完全基于 Region 本地实现:每个 Region Leader 独立维护自己的内存锁表 (Lock Table) 和锁等待队列,死锁检测器也以 Region 为单位构建局部等待图

1 个赞

悲观锁会锁得更频繁

迁移升级建议先在小规模环境做充分的兼容性测试,特别是SQL语法、自增主键、事务隔离级别这几个方面。如果是分库分表迁移,要注意全局唯一ID的生成方式,推荐用 AUTO_RANDOM 替代自增主键。

每个 region leader 维护本地锁表和等待队列,集群统一检测器汇总信息判断死锁。region 分裂或迁移时,会暂停新上锁,完整迁移锁与等待队列,同时保留旧依赖,配合锁超时机制,避免误判和漏判死锁。

  • 各 Region Leader 维护本地锁等待队列,上报等待关系至全局死锁检测器,通过等待图环检测判定死锁并回滚事务。
  • Region 分裂 / 迁移时冻结本地锁表,同步迁移锁与等待队列,同步更新全局等待图,检测机制暂冻结,完成后恢复。同步迁移锁与等待队列,同步更新全局等待图,检测机制暂冻结,完成后恢复。

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