范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

实战分享你知道这个死锁是怎么产生的吗?

  文章转载自 腾讯云数据库 id: TencentDB
  | 作者 王文安,腾讯CSIG数据库专项的数据库工程师,主要负责腾讯云数据库 MySQL 的相关的工作,热爱技术,欢迎留言进行交流。
  Part1 背景
  锁作为 MySQL 知识体系的主要部分之一,是每个 DBA 都需要学习和掌握的知识。锁保证了数据库在并发的场景下数据的一致性,同时锁冲突也是影响数据库性能的因素之一。而锁冲突中,有一类很经典的场景经常会拿出来讨论:死锁。最近刚好也遇到了一个典型的死锁案例,本文会基于这个案例,做一次详细的分析与拆解。
  Part2 问题
  由于innodb engine status会记录最近一次死锁的细节信息,因此案例现场的信息是可以完整拿到的。用户针对这个死锁的问题,提出了疑问:数据更新的并不是同一行,使用的也是不同的索引,为什么会发生死锁?(以下细节信息均已脱敏)
  死锁的两个语句如下:
  UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6247476) AND (id2 = 74354)
  UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6249219) AND (id2 = 74354)
  精简之后的 MySQL 死锁信息如下:
  =====================================
  2020-10-26 12:14:30 7fd2642f5700 INNODB MONITOR OUTPUT
  =====================================
  ...省略...
  ------------------------
  LATEST DETECTED DEADLOCK
  ------------------------
  2020-10-26 12:12:03 7fd2846ed700
  *** (1) TRANSACTION:
  TRANSACTION 1795660514, ACTIVE 0 sec starting index read
  mysql tables in use 3, locked 3
  LOCK WAIT 4 lock struct(s), heap size 1184, 3 row lock(s)
  MySQL thread id 21829887, OS thread handle 0x7fd28d14a700, query id 178279444 172.21.0.15 username updating
  UPDATE tbl_deadlock SET col1= 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6247476) AND (id2 = 74354)
  *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
  RECORD LOCKS space id 8575 page no 286947 n bits 1048 index `id2` of table `deadlock`.`tbl_deadlock` trx id 1795660514 lock_mode X waiting
  Record lock, heap no 429 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
  0: len 4; hex 00012272; asc "r;;
  1: len 4; hex 00721f45; asc r E;;
  *** (2) TRANSACTION:
  TRANSACTION 1795660513, ACTIVE 0 sec fetching rows
  mysql tables in use 3, locked 3
  20 lock struct(s), heap size 2936, 40 row lock(s)
  MySQL thread id 21905203, OS thread handle 0x7fd2846ed700, query id 178279443 172.21.0.15 username updating
  UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6249219) AND (id2 = 74354)
  *** (2) HOLDS THE LOCK(S):
  RECORD LOCKS space id 8575 page no 286947 n bits 1048 index `id2` of table `deadlock`.`tbl_deadlock` trx id 1795660513 lock_mode X
  Record lock, heap no 429 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
  0: len 4; hex 00012272; asc "r;;
  1: len 4; hex 00721f45; asc r E;;
  Record lock, heap no 430 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
  0: len 4; hex 00012272; asc "r;;
  1: len 4; hex 00721fe3; asc r ;;
  Record lock, heap no 431 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
  0: len 4; hex 00012272; asc "r;;
  1: len 4; hex 0072218f; asc r! ;;
  ...省略很多 Record lock...
  *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
  RECORD LOCKS space id 8575 page no 344554 n bits 120 index `PRIMARY` of table `deadlock`.`tbl_deadlock` trx id 1795660513 lock_mode X locks rec but not gap waiting
  Record lock, heap no 9 PHYSICAL RECORD: n_fields 44; compact format; info bits 0
  0: len 4; hex 00722663; asc r&c;;
  ...省略无关的两行...
  3: len 4; hex 005f5434; asc _T4;;
  4: len 4; hex 00012272; asc "r;;
  ...省略很多行...
  *** WE ROLL BACK TRANSACTION (1)
  ...省略...
  Part3 原因分析
  首先简单了解一下死锁的几个要素:
  1. 互斥条件:一个资源每次只能被一个进程占用。MySQL 的锁机制天然具备这个条件。
  2. 请求与保持条件:资源请求被阻塞时,已持有的资源不会被释放。MySQL 不触发死锁回滚,且未进入 lockwait_timeout 的时候,具备这个条件。
  3. 不剥夺条件:已获得的资源,在末使用完之前,不能强行剥夺。MySQL 的锁机制天然具备这个条件。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系,通常会表现为有向环。
  由于 MySQL 的锁机制的原因,只需要判断出两个 SQL 语句的锁存在循环等待,那么死锁的条件就会成立了。
  接下来对 MySQL 记录的死锁信息进行详细的分析,首先观察死锁的事务详情这一部分信息:
  LOCK WAIT 4 lock struct(s), heap size 1184, 3 row lock(s)。
  ......
  20 lock struct(s), heap size 2936, 40 row lock(s)
  可以很明显可以发现,这两个语句涉及到的数据行还是比较多的,用户的疑问:数据更新的并不是同一行,其实是个误解。那么理论上,"循环等待:互相持有对方需要的锁",这种典型的死锁场景是可能会存在的。
  接下来,重点放在更细节的信息上:
  *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
  RECORD LOCKS space id 8575 page no 286947 n bits 1048 index `id2` of table `deadlock`.`tbl_deadlock` trx id 1795660514 lock_mode X waiting
  Record lock, heap no 429 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
  0: len 4; hex 00012272; asc "r;;
  1: len 4; hex 00721f45; asc r E;;
  ......
  *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
  RECORD LOCKS space id 8575 page no 344554 n bits 120 index `PRIMARY` of table `deadlock`.`tbl_deadlock` trx id 1795660513 lock_mode X locks rec but not gap waiting
  Record lock, heap no 9 PHYSICAL RECORD: n_fields 44; compact format; info bits 0
  0: len 4; hex 00722663; asc r&c;;
  ...省略无关的两行...
  3: len 4; hex 005f5434; asc _T4;;
  4: len 4; hex 00012272; asc "r;;
  ...省略很多行...
  用户提出的疑问:使用的也是不同的索引,为什么会发送死锁?实际上二级索引上的记录锁,最终也会加到主键上。
  这个很好理解,如果二级索引上,通过搜索商品表的商品名称索引(二级索引)搜索"iphone12",并给这一行数据加上了锁,锁住了"iphone12"这个商品的详情数据行,如果别的事务可以通过搜索主键来修改这一行数据,明显是不行的。
  因此本案例中,虽然死锁信息中记录的索引名称不一样,但是锁争用的条件是成立的,即:trx1 通过二级索引向主键上执行了加锁操作,而 trx2 在其他的二级索引上拿到了锁,但是主键锁拿不到,因此进入了等待状态。所以只需要定位到具体锁的数据,找到循环等待的逻辑关系,就可以完成整个案例分析了。
  参考上文引用的信息,具体发生死锁的行的信息都记录在类似0: len 4; hex 00722663; asc r&c;;的信息中。
  trx1 记录的锁等待信息是二级索引 id2,因为 id2 是一个单行索引,因此只会有 0 和 1 两行信息,0 代表的就是具体的行 id2,1 即为主键。通过 16 进制转换工具,转成 10 进制,可以发现对应的数据如下:
  pk = 7479109 and id2 = 74354
  那么再看看 trx2 记录的信息,锁等待方面,记录的信息是主键,所以这个地方会有完整的表数据,过滤掉无效的数据之后,留下了三行:0 为主键,3 为 id1,4 为 id2。转换进制之后,对应的数据如下:
  pk = 7480931 and id1 = 6247476 and id2 = 74354
  可以看到,trx2 等待的锁,id1 和 id2 刚好满足 trx1 的查询条件。而 trx2 持有的锁信息中,第一个刚好就是 trx1 等待的:
  编辑搜图
  请点击输入图片描述
  trx2 持有的锁
  那么关于这个死锁案例的具体场景,就可以用下有向环的图例进行说明:
  编辑搜图
  请点击输入图片描述
  死锁图例
  至此为止,这个死锁的案例分析就完成了,从最初的死锁成立条件分析,到解读具体的锁内容,最终完成了死锁的有向环图例。
  实际上,自己观察一下这个死锁的有向环图例,会发现这两个语句用到了两个单列索引,那么进一步思考的话,如果这两个列建成了联合索引,这个死锁的案例是不是就可能不会发生了?
  Part4 总结
  对于死锁的问题,只需要根据四个条件,一步一步过滤与分析,通过解读死锁现场的详细内容,就可以准确的还原整个死锁的发生原因以及涉及到的数据行。当然,在实际的业务环境中,可能还会有更复杂和隐蔽的死锁案例,但是不论多么隐蔽和复杂,死锁分析的思路和步骤都是相似的。

不明白为什么越亲密,越容易吵架?快来看看艾米老师原创第3篇愿每对夫妻都恩恩爱爱到白头!1hr婚姻里,再恩爱的夫妻也难免吵架,毕竟各自都是在不同的家庭环境中长大,各自的经历和观念也会有分歧。吵架很正常,恐怖的是越吵越凶,乃如何培养这两种优秀的孩子第一种是学习能力强,有担当有责任感的人。这一特点将决定孩子的学习工作生活以及将来自己家庭成功与失败,在社会人际关系中也是无所不及。有些小孩子,他们虽然还没有上学,也没有接受过系统的警惕假期滑坡,6大好习惯必将让孩子新学期成绩起飞!文艾米老师首发择学堂(IDzexuetangcom)暑假假华丽丽来袭,孩子乐开了怀,家长笑得合不拢嘴,身边很多家长都觉得要好好休息,学习暂且放一边,先允许自己跟孩子痛痛快快玩个十天还没长大就让人讨厌的孩子,长什么样?文艾米老师首发于择学堂(zexuetangcom)你有没有遇到过这样几类人?他们碰到点小挫折就唉声叹气,恨不得向全世界大倒苦水他们想要夸你,却总把你弄得浑身难受他们思想狭隘,认为看暑假是拉开孩子差距的关键期,千万不能荒废!这些建议太有用了文艾米老师,图片素材来源于网络。暑假太神奇孩子满血复活,走路带劲了,眼神也活泛了!不过,一说到作业,他们就秒变戏精导演!之前网上有一则新闻,让人哭笑不得。一个小学生自称遭绑架,结果孩子不想刷牙,父亲竟然边打边骂!摊上脾气差的家长,真可怜生活节奏很快,工作压力大,生活太琐碎。做了父母的人,既然努力赚钱养娃,又要抽出时间带娃,上有老,下有小,多角色之间来回切换,难免有点脾气。可是呀,咱还是要牢记,做一个情绪稳定的父母荷花之美都藏在这18首唯美的诗词里,清凉了整个夏天!在中国古诗词的意象里,好多花都象征着不同的人格特征。而荷花,自古以来都被尊崇为君子,象征着洁身自好的高尚品德。引用最多的当属周敦颐那句出污泥而不染!古代文人雅士,以荷花为题材的作品孩子睡不好的问题出在哪?怎样让孩子睡好觉?宝宝睡不好,不但影响大脑发育和身体发育,也让妈妈们身心俱疲。特别是在适应新世界到快速成长的01岁宝宝,更容易出现关于睡眠的问题。那么这个阶段的宝宝会有哪些常见的睡眠问题?又有哪些方因为自闭症,这个家庭濒临破碎,和谐生活的开始竟因为一只狗狗?这是一个真实的故事。Kely爱他的妈妈,一位自闭症孩子的母亲终于等到了孩子说出这句话。而Kely并不是一开始就会表达自己。最开始的他,无故发脾气哭闹甚至做出伤害妈妈的行为Kyle是当我在学习言语语言治疗时,我在学习什么?报名抢免单惊喜随着儿童言语语言治疗师专业技能培训一期学员的顺利毕业,这门备受瞩目的课程马上要迎来1月28日第四期的开班。第一期考试,共计214位老师参加,获得100分的学员有14位,95分99分这几招帮助孩子迅速安坐,再也不用担心TA无法融入课堂啦作者吕依璠编辑教研院融合课堂对于孤独症谱系障碍的小朋友来说,是挑战也是机遇。随班就读的三十年来,从追求融合的数量到追求融合的质量,我们的观念也经历了很多转变。随班就读不能仅仅是随班
刮痧拔罐按摩的目的是什么?(包括针灸药也是殊途同归)01hr接触养生这行有几年了,时有感悟,随笔写下,既是对自己学习和工作的总结,也可与网友们一起分享。我们刮痧的目的,是通经络,因为经络可以决生死,处百病,调虚实,不可不通。同样,按半夜三四点就醒,睁眼到天亮,这样吃,吃出好眠体质虽然到了夏天,人们总爱说夏乏,好像并不缺觉,但其实失眠的人反而更多了。睡前怎么都静不下心来,越躺越烦躁睡着了却常常醒,能从半夜睁眼到天亮白天昏沉犯困,一到晚上反而精神百倍,毫无睡意中医常说脾胃一虚百病生健补脾胃,在养生过程中至关重要01hr民以食为天,饮食是维持生命和身体健康的重要保证。食物进入机体后的消化吸收是由脾胃支持完成的,所以又有脾胃一虚百病生的说法。道医的脾脏并不指某一个具体的解剖器官,而是一个功能偏方治大病?中医越老越好?中药慢?是时候纠正这些错误了中医入门之道,究竟如何探寻?这篇文章或许可以帮你拨开眼前的迷雾,走进学习中医的大门。一中医是经验医学?中医要有临床经验,但是更重要的是中医要有理论指导,如果没有理论指导,中医就永远三伏天里,黄芪一定要用点!多加一味,功效翻倍,便宜又好用!央视一档节目中国医药介绍了中国的长寿之乡浙江桐庐,全县人口预期寿命超过80岁。中国中医科学院脾胃病专家魏玮来到这里,发现随处可见天然生长的土黄芪,这里的村民平时挖来晒干泡水喝。黄芪中医补气有三宝黄芪人参西洋参!告诉你怎么用久病体虚的人适合用人参补气一般大家都会认为人参的药性很猛,不适用于久病体虚的人。其实人参是心肝脾肺肾五脏都补,五脏平和才能够百病不生,越是久病体虚的人越适合用人参来补气。人体虚弱,英语地位下降后,小学新增了一门中医课程,家长学这个比英语强教育是从孩子小时候就要抓起,这样有利于孩子以后的发展。每一个孩子到了上学的年龄,就要由老师接受教导,老师传授学生们知识,让他们一点一点学会知识,这样才会让自己饱读诗书,让自己在以后湖南的美女学霸,生命定格在高考前夕,临终前的一番话感动众人生命是短暂的,是一去不复返的,人的一生犹如白驹过隙,时间不可倒转,我们只能在有限的生命绽放无限的光彩。我们常说身体是革命的本钱,一个人想要做任何事情,都需要在一个健康的身体基础上进兰州首批车驾管自助体检机上线了驾驶人体检10分钟自助完成每日甘肃网4月17日讯(新甘肃每日甘肃网记者郭秀睿)今天,记者从兰州市公安局了解到,首批4台车驾管自助体检机已在兰州新区七里河雁滩城关交警大队车管所试点投放使用,可提供期满换证初次甘肃中医药大学4月20日起错峰开学据兰州晚报报道记者4月16日了解到,甘肃中医药大学发布开学返校告知书明确,将于4月20日起分期分批错峰报到。告知书称,4月20日21日,五里铺校区率先开门迎接学生返校,第一批返校的17岁少女结束生命控制欲强的父母,很容易养出极端的孩子,别傻当看到这样的消息的时候,内心是非常难受的。一个17岁的初三女孩,在与父母发生争吵后离家出走。两天后,找到这个女孩子的时候,已经没有了呼吸。不难想象,这个女孩子的父母,是怎样一种撕心