死锁误解
时常听客户聊起死锁时,都认为死锁完全是应用的问题,是应用SQL语句获取资源的逻辑有问题才产生死锁,所以但凡看到死锁,都需要交给开发去定位业务逻辑。其实造成死锁的原因有很多,本文模拟重现的为外键无索引引起死锁的案例。
故障模拟
测试环境通过以下脚本,初始化两张父子表,会话1先删子表数据1,会话2删子表及父表数据2,会话1再删除父表1,可重现死锁故障。
session 1:
session 2:
session 1:
故障分析
会话1 先持有 子表上行锁,会话2 也是先持有 子表上行锁,后因为外键无索引,会话2 再次在父表删除数据时,子表上表锁,监控出现了两个阻塞源(会话1,会话2),会话1 此时在父表上删数据时,子表上表锁,(会被1,2会话阻塞)这时候就会出现死锁。
处理思路
子表外键加上索引:
巡检思路
巡检全库无索引的外键
隐患分析
外键上未建索引会引起更新父表时,子表锁升级,进而极大降低系统并发性,也容易形成死锁,影响系统正常运行。
领取专属 10元无门槛券
私享最新 技术干货