两把锁都有人拿,谁也不肯先松手

死锁不会触发借用检查器,也不一定报错。程序只是安静地卡住。按最经典的四步走一遍,再把锁顺序统一,区别就会非常具体。

线路可继续调度
线程 B 的拿锁顺序
线程 A
数据库 → 日志
尚未拿锁
线程 B
日志 → 数据库
尚未拿锁
等待边会在这里形成:线程 → 想要的锁 → 当前持有者
🔒 数据库锁空闲
🔒 日志锁空闲
执行单元已经持有正在等待
线程 A——
线程 B——