index_merge引发的死锁排查

前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁。通过定位排查发现,问题的源头就是index_merge,死锁的原因也很普通,两个事务加锁顺序不同,并存在相互等待的情况。因为这个案例比较特殊,所以在此分享给大家。

拿到死锁问题,首先需要查看几个基本信息,包括死锁等待关系,表结构定义等。

通过show engine innodb status;命令可以获取innodb引擎中最近一次发生死锁的信息,信息如下

从死锁结果来看,我们很容易看到事务1持有 partner_id二级索引上的锁,等待PK索引上的锁;而事务2持有PK索引锁,等待partner_id二级索引上的锁,两个事务相互持有对方需要的锁资源,而无法往前推进,造成死锁。单从死锁信息来看,我们可能会比较疑惑,每个事务只有一个语句,为什么同样的语句,对二级索引和主键的加锁顺序会不同?

产生死锁的原因

首先我们来看看语句的执行计划,

语句的type是index_merge,Extra的信息是Using intersect(customerid,partnerid),从而我们得知语句执行计划走了index_merge优化,单个语句通过两个索引(customerid,partnerid)来提取记录集合并取交集获得最终结果集。index_merge具体算法不在此展开,基本使用场景是语句包含多个查询条件,每个条件都单独存在索引,而单个条件的索引过滤度不高,组合起来过滤度比较高,这个时候就可能会走index_merge优化,使得单个SQL语句可以同时利用两个索引过滤。会不会与index_merge有关呢?

在index_merge的情况下,会导致二级索引与主键索引顺序不一致的情况吗?结合上面的死锁信息,我们得知死锁两个的二级索引key是0x698,而主键索引key是0x21747。我们看看到底是哪条记录的主键和二级索引发生了死锁,

可以看到0x21747对应的customer_id为151069,partner_id为1688,是不是感觉似曾相识,对的,第二个事务的语句查询条件就是这两个条件的组合。这说明,对于这条记录,第一个事务语句只有partnerid索引(1688)满足条件;对于第二个事务,customer_id和partner_id索引都满足条件。由于每个语句执行时都需要利用两个二级索引,假设先使用customer_id索引扫描,然后使用partner_id索引扫描,那么对于id为0x21747的记录,事务1的partner_id=1688满足条件,加partner_id锁,然后对对应的PK索引加锁;对于事务2,对customer_id= 151069加锁,对对应的PK索引加锁,然后对partner_id=1688索引加锁。那么对partner_id二级索引和PK主键索引在两个事务的上锁顺序是相反的,所以导致了死锁。对于id为0x21747记录:

表格第2步和第3步,两个事务的加锁顺序是相反的,导致了死锁发生。

前面啰啰嗦嗦讲了一个死锁案例的来龙去脉,但仅仅是产生死锁的一种情况。生产环境中,我们当然不需要死锁频繁发生,毕竟是需要部分事务回滚才能解锁的,下面介绍几个简单的原则,有助于减少死锁的发生。

1) 尽量按顺序加锁,从源头避免死锁
2)选择合适的隔离级别,隔离级别越高,并发冲突越激烈,实际场景Read-Committed就够用了
3)避免使用大事务,根据二段锁原则,只有事务结束(提交或回滚)才会释放锁,持有的锁越多,可能导致的冲突越大
4)为表添加合适的索引,避免走不到索引导致对每条记录都加锁

Original: https://www.cnblogs.com/cchust/p/6464188.html
Author: 天士梦
Title: index_merge引发的死锁排查

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/591740/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 函数式编程-Stream流

    函数式编程-Stream流 1. 概述 1.1 为什么学? 能够看懂公司里的代码 大数量下处理集合效率高 代码可读性高 消灭嵌套地狱 //查询未成年作家的评分在70以上的书籍 由于…

    数据库 2023年6月6日
    094
  • IDEA 快捷键

    普通快捷键 分类 说明 快捷键 代码提示 代码提示或自动补全 Alt + / 代码提示 Ctrl + Alt + Space 提示方法参数类型 Ctrl + P 提示注释文档 Ct…

    数据库 2023年6月6日
    086
  • 尤娜,我去面试了

    前情回顾 从前,有一个简单的通道系统叫尤娜…… 尤娜系统的第一次飞行中换引擎的架构垂直拆分改造 四种常用的微服务架构拆分方式 面试前几天 尤娜系统经过一次拆…

    数据库 2023年6月6日
    093
  • 数字图像处理—检测交通视频中运动目标的程序设计

    初始条件: (1)数字图像处理的基本理论学习; (2)Matlab或Visual C++软件工具。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)…

    数据库 2023年6月16日
    0130
  • SQL的约束

    概念:约束是作用于表中字段上的规则,用于限制存储表中的数据; 常见的约束分类:约束 描述 关键字 非空约束 限制该字段的数据不能为null not null 唯一约束 保证该字段的…

    数据库 2023年6月16日
    0102
  • 电脑必须打开的设置

    电脑性能设置 优化设置一:开启卓越性能 其实,win10系统中有一个卓越性能的隐藏设置,它可以让我们的电脑,在现有配置的情况下,发挥出最优良的性能。 1、 同时按住”w…

    数据库 2023年6月14日
    0117
  • 容器化 | 在 Rancher 中部署 MySQL 集群

    我们已经介绍了如何在 Kubernetes 和 KubeSphere 上部署 RadonDB MySQL 集群。本文将演示如何在 Rancher[1] 上部署 RadonDB My…

    数据库 2023年5月24日
    0132
  • MYSQL性能优化以及建议

    1、业务代码组合逻辑后进行数据库操作,如根据波次进行库存分配,可以将波次里面的订单所有明细进行分组,然后匹配库存。2、将大字段、不常用字段放置到扩展表中,将经常使用(状态、数量、编…

    数据库 2023年5月24日
    080
  • 慢SQL,压垮团队的最后一根稻草!

    一、什么是慢 SQL 什么是慢SQL? 顾名思义,运行时间较长的 SQL 语句即为慢 SQL! 然后,问题就出现了。需要多长时间才能慢下来? [En] Then the quest…

    数据库 2023年5月24日
    0102
  • 04-MySQL锁

    数据库锁 1、SQL语言包括那几个部分 SQL语言包括 数据定义(DDL)、数据操纵(DML)、数据控制(DCL)和数据查询(DQL)四个部分 2、每部分都有哪些操作关键词 数据定…

    数据库 2023年6月16日
    092
  • Mysql_事务_存储过程_触发器

    一、什么是事务? 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库…

    数据库 2023年6月11日
    0110
  • MySQL建表语句生成Golang代码

    1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码、基础的增删改查代码(基础的增删改查服务可以划入DAO(D…

    数据库 2023年6月14日
    0103
  • MySQL隐式转换的坑

    MySQL以以下规则描述比较操作如何进行转换: 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 实际使用中经研究发现字符串和数字比较时,优先把字符串转换为…

    数据库 2023年6月9日
    085
  • Linux系统下nginx的安装与卸载

    1.1 安装 准备依赖环境 1.安装 gcc 依赖库 yum install gcc-c++ 2.安装 PCRE pcre-devel 依赖库 yum install -y pcr…

    数据库 2023年6月11日
    0106
  • 客户流失?来看看大厂如何基于spark+机器学习构建千万数据规模上的用户留存模型 ⛵

    💡 作者:韩信子@ShowMeAI📘 大数据技术 ◉ 技能提升系列:https://www.showmeai.tech/tutorials/84📘 行业名企应用系列:https:/…

    数据库 2023年6月14日
    092
  • JSON

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。并有效地提升网络传输效率。 一. 什么是 …

    数据库 2023年6月11日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球