← 中文资源

简体中文版本

死锁诊断工作流

在死锁时刻捕获锁等待图、识别环、按有序加锁破环以诊断死锁。

阅读英文原文

步骤与决策

捕获等待图:死锁为锁等待图环——事务 A 持锁 1 等锁 2,事务 B 持锁 2 等锁 1。死锁时刻图含环,转储为首步。识别环:等待图环即死锁,环中事务为死锁集,锁为争资源,环解释谁持何等何即诊断。加锁序:环因两事务以不同序加锁。设锁全序确保所有事务按序加锁则环不能成:若每事务先锁 1 后锁 2 则无事务持锁 2 等锁 1。验证:复现流量跑 10000 次无死锁,锁序由测试运行时断言与生产代码审查强制,未来违序变更上线前被捕获。

验证与后续

本死锁诊断工作流的验证方法与后续步骤已在上文详述。本译文依据英文原文完整重写,步骤与命令与英文版本严格一致,可在本地按工作流步骤复现并核对结果。该工作流难度级别为advanced,预计耗时约45分钟。若用于生产环境,请先结合自身环境调整参数与阈值,并确保团队熟悉相关工具链与操作流程。

代码示例

dump-wait-graph > graph.dot
cycle-detect graph.dot
// Always acquire locks in ascending id order
const locks = [l1, l2].sort(byId);
for (const l of locks) await l.acquire();