前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >死锁分析

死锁分析

作者头像
码农戏码
发布2021-03-23 16:31:30
6090
发布2021-03-23 16:31:30
举报
文章被收录于专栏:DDD

最近新项目上线,在压测和发布生产都出现了好几种死锁情况,分析一二

死锁日志

日志一:

日志二:

日志三:

这三个死锁日志特别的有意思,都是同一条SQL,但各种组合样的死锁都齐活了

日志一的两条sql,where里面的条件不同;

日志二和日志三sql完全一样,其实是两次调用(同一时刻并发调用),调用条件不同,但在程序处理时这条SQL的where条件一样而已

分析

隔离级别RC

日志一,where里面的条件不同

第一个事务在等待RECORD LOCKS,锁模式为X model;位置在space id 428 page no 178

第二个事务持有RECORD LOCKS,锁模式为X model;位置也在space id 428 page no 178;等待的锁也是RECORD LOCKS,锁模式为X model,也在space id 428 page no 178

这个死锁很是奇怪,同一条sql,都是在索引【idx_tenant_user】上加锁,完全不符合死锁的循环等待特征

这张表上的索引

代码语言:javascript
复制
KEY `idx_collection_no` (`collection_no`) USING BTREE,KEY `idx_uniflag` (`invoice_uiq_flag`) USING BTREE,KEY `idx_tenant_user` (`tenant_id`,`user_id`) USING BTREE

通过explain查看此语句

索引上看使用idx_tenant_user,也与死锁日志一致,但怎么就死锁了呢?

【SHOW ENGINE INNODB STATUS;】只能显示最终发生死锁时的sql,并不能显示全部的sql,从程序上下文中寻找,发现点蛛丝马迹

事务2在T1时刻执行了一条根据id更新数据的sql,这条sql会在id聚簇索引上加X锁,还会在二级索引上加X锁,所以先获得了(userid,tenantid)锁,

事务1在T2时刻只能等待

事务2在T3时刻形成了循环等待,deadlock

日志二,sql完全一样

与前面解释,两个并发请求,入参不同,但到这个方法时,sql的条件是一样的

日志三,sql也完全一样

虽然与日志二的SQL一样,但死锁日志却不同


为什么同样的SQL,却得出各样的结果?时而collection_no索引在前,时而组合索引在前

苦思几日,在线上跑了下explain,发现了些问题

原来线上使用的index merge

有官网上有介绍:https://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html

MySQL在分析执行计划时发现走单个索引的过滤效果都不是很好,于是对多个索引分别进行条件扫描,然后将多个索引单独扫描的结果进行合并的一种优化操作。合并的方式分为三种:intersection、union和sort_union index merge 之 intersect,简单而言,index intersect merge就是多个索引条件扫描得到的结果进行交集运算。显然在多个索引提交之间是 AND 运算时,才会出现 index intersect merge.

正因为index merge,所以索引的真正执行顺序是不一样的,也就造成了各种表象

解决

建立联合索引

都使用主键更新

关掉参数index_merge_intersection=off,禁用index_merge功能

参照

MySQL 优化之 index_merge

一个 MySQL 死锁案例分析

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农戏码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 死锁日志
    • 日志一:
      • 日志二:
        • 日志三:
        • 分析
          • 日志一,where里面的条件不同
            • 日志二,sql完全一样
              • 日志三,sql也完全一样
              • 解决
              • 参照
              相关产品与服务
              云数据库 SQL Server
              腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档