学习
实践
活动
工具
TVP
写文章

数据库巡检系列-死锁成因2

死锁误解

时常听客户聊起死锁时,都认为死锁完全是应用的问题,是应用SQL语句获取资源的逻辑有问题才产生死锁,所以但凡看到死锁,都需要交给开发去定位业务逻辑。其实造成死锁的原因有很多,本文模拟重现的为外键无索引引起死锁的案例。

故障模拟

测试环境通过以下脚本,初始化两张父子表,会话1先删子表数据1,会话2删子表及父表数据2,会话1再删除父表1,可重现死锁故障。

session 1:

session 2:

session 1:

故障分析

会话1 先持有 子表上行锁,会话2 也是先持有 子表上行锁,后因为外键无索引,会话2 再次在父表删除数据时,子表上表锁,监控出现了两个阻塞源(会话1,会话2),会话1 此时在父表上删数据时,子表上表锁,(会被1,2会话阻塞)这时候就会出现死锁。

处理思路

子表外键加上索引:

巡检思路

巡检全库无索引的外键

隐患分析

外键上未建索引会引起更新父表时,子表锁升级,进而极大降低系统并发性,也容易形成死锁,影响系统正常运行。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180713G0XH8U00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券