死锁案例六 迷南。 2022-12-10 11:26 169阅读 0赞 ### 来源:公众号yangyidba ### ### ### ### 一、前言 ### 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。 ### 二、案例分析 ### #### 2.1 环境说明 #### MySQL 5.6.24 事务隔离级别为 RR create table tx ( id int not null primary key auto_increment , c1 int not null default 0, c2 int not null default 0, key idx_c1(c1) ) engine=innodb ; insert into tx values(24,3,4),(25,3,4), (26,3,4),(30,5,8); #### 2.2 测试用例 #### ![format_png][] #### 2.3 死锁日志 #### ---------------------------------- LATEST DETECTED DEADLOCK ------------------------ 2018-03-27 15:40:40 0x7f75cafce700 *** (1) TRANSACTION: TRANSACTION 1850, ACTIVE 20 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s) MySQL thread id 379040, OS thread handle 140143994337024, query id 1521958 localhost root updating update tx set c2=8 where c1=5 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 27 page no 3 n bits 72 index PRIMARY of table `test`.`tx` trx id 1850 lock_mode X locks rec but not gap waiting *** (2) TRANSACTION: TRANSACTION 1849, ACTIVE 32 sec updating or deleting, thread declared inside InnoDB 4999 mysql tables in use 1, locked 1 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1 MySQL thread id 379016, OS thread handle 140143893473024, query id 1521976 localhost root updating delete from tx where id=30 *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 27 page no 3 n bits 72 index PRIMARY of table `test`.`tx` trx id 1849 lock_mode X locks rec but not gap *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 27 page no 5 n bits 72 index idx_c1 of table `test`.`tx` trx id 1849 lock_mode X locks rec but not gap waiting *** WE ROLL BACK TRANSACTION (1) #### 2.4 分析死锁日志 #### 首先要理解的是 对同一个字段申请加锁是需要排队的。 其次表 ty 中索引 idx\_c1 为非唯一普通索引,我们根据事务执行的时间顺序来解释,这样比较好理解。 > T1: sess2 执行select for update 操作持有记录id=30的主键行锁:PRIMARY of table test.tx lock\_mode X locks rec but not gap > > T2: sess1 语句 update 通过普通索引idx\_c1更新c2,先获取idx\_c1 c1=5的X锁lock\_mode X locks rec but not gap,然后去申请对应主键id=30的行锁,但是sess2 已经持有主键的行锁,于是 sess1 等待。 > > T3: sess2 执行根据主键 id=30 删除记录,需要申请 id=30 的行锁以及 c1=5 的索引行锁。但是 sess1 以及持有该锁,故会出现 index idx\_c1 of table test.tx trx id 1849 lock\_mode X locks rec but not gap waiting **sess2(delete) 等待 sess1(update),sess1(update) 等待 sess2(select for update) 循环等待,造成死锁。** 对于 RDBMS 系统出现死锁的根本原因都可以概括为:**不同的事务加锁的顺序不一样导致循环等待,进而导致死锁。** #### 2.5 解决方法 #### 修改 sess1 的 update 为根据主键来更新 也即 **update tx set c2=x where id=30**,把加锁方式改为顺序加锁,申请主键 id 的锁,避免通过交叉加锁,相互申请对方持有的锁。 ### 三、小结 ### 上面的案例中出现死锁是由于不同会话对普通索引 idx\_c1 和主键相互竞争导致循环等待而出现死锁的。生产过程中遇到高并发更新同一行的的时候可以考虑避免通过不同的索引进行更新,进而避免死锁。 **扩展阅读** * [死锁案例五][Link 1] * [死锁案例之四][Link 2] * [死锁案例之三][Link 3] * [死锁案例之二][Link 4] * [死锁案例之一][Link 5] * [漫谈死锁][Link 6] * [如何阅读死锁日志][Link 7] 全文完。 Enjoy MySQL :) 叶老师的「MySQL核心优化」大课已升级到MySQL 8.0,扫码开启MySQL 8.0修行之旅吧 ![format_png 1][] [format_png]: /images/20221123/f091cf966a14432391677900218285c0.png [Link 1]: http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&chksm=bd3b49a28a4cc0b486f1d43e03d8637b3d38126204ddb4aeebea9a2080478f11a015917d8aaa&idx=1&mid=2653934536&scene=21&sn=dad17ee35e45b34049e3e4ec6dc1d015#wechat_redirect [Link 2]: http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&chksm=bd3b49018a4cc017643fed70ce3316e4dd07042fe286f51a9bbbc906aedfa2d48b50870aedb3&idx=1&mid=2653934443&scene=21&sn=b60c700cbf90d84a48b060b9ed1fcaa5#wechat_redirect [Link 3]: http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&chksm=bd3b49468a4cc050c699592a4970a33c61db386589f6199b8d9d6a0b1ac4eb3aabc5d52aa3dc&idx=1&mid=2653934380&scene=21&sn=3266e158add079c382329644e65d5318#wechat_redirect [Link 4]: http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&chksm=bd3b49628a4cc0742336c9684c704012198da94e28aff48be179b553e2557cd2a125fd13232d&idx=1&mid=2653934344&scene=21&sn=9b1a4ec019b19dd8a8367e34e3b11ee6#wechat_redirect [Link 5]: http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&chksm=bd3b48b38a4cc1a57f5e3bdbacb09c3ced1bf70484aca7de764c651e2ce40688ad7aa90704b3&idx=1&mid=2653934297&scene=21&sn=1b4415f14d1350a00cf4866817d2395e#wechat_redirect [Link 6]: http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&chksm=bd3b542f8a4cdd39f6195aceb447b7dda3c043af8a00e4048abc66f1150d122762ba93220940&idx=1&mid=2653933125&scene=21&sn=54e4c1a12223c45e4232e2227d7d19da#wechat_redirect [Link 7]: http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ%3D%3D&chksm=bd3b48b38a4cc1a57362dba651734cd5aea259b9ebd770685f54927f7877f98f3279c5e4c072&idx=2&mid=2653934297&scene=21&sn=c5d2afc9fab595801f640ab616f03bde#wechat_redirect [format_png 1]: /images/20221123/205799584f9e4e57a9e04ac09abe3a61.png
相关 死锁案例 死锁成因 了解了innodb锁的基本原理后,下面分析下死锁的成因。如前面所说,死锁一般是事务相互等待对方资源,最后形成环路造成的。下面简单讲下造成相互等待 r囧r小猫/ 2023年01月05日 04:00/ 0 赞/ 207 阅读
相关 死锁案例 七 一、前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁 「爱情、让人受尽委屈。」/ 2022年12月13日 01:29/ 0 赞/ 156 阅读
相关 死锁案例 六 一、前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁 Myth丶恋晨/ 2022年12月13日 01:29/ 0 赞/ 185 阅读
相关 死锁案例六 来源:公众号yangyidba 一、前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发同学都会在工作过程中遇见 。关于死 迷南。/ 2022年12月10日 11:26/ 0 赞/ 170 阅读
相关 死锁案例五 来源:公众号yangyidba 一、前言 死锁其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发朋友都会在工作过程中遇见。关 朱雀/ 2022年12月08日 05:07/ 0 赞/ 185 阅读
相关 死锁案例 五 一、前言 死锁其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋 Love The Way You Lie/ 2022年12月08日 01:44/ 0 赞/ 195 阅读
相关 死锁案例 二 一 前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助 深碍√TFBOYSˉ_/ 2022年12月08日 01:44/ 0 赞/ 125 阅读
相关 死锁案例三 来源:公众号yangyidba 一、前言 死锁其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发朋友都会在工作过程中遇见。关于死锁我 超、凢脫俗/ 2022年12月02日 04:28/ 0 赞/ 205 阅读
相关 死锁案例一 来源:公众号yangyidba 一、前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个 DBA 和部分开发同学都会在工作过程中遇见 。关于死锁我会持 电玩女神/ 2022年11月29日 12:42/ 0 赞/ 204 阅读
相关 死锁案例分享 在实际开发中,死锁的案例可遇不可求。有些人可能开发了5年甚至10年,也没有在生产环境下遇到过死锁案例。如果真的遇到了死锁问题,你应该庆幸,先不要担心能不能解决,毫无疑问的... 小灰灰/ 2020年05月14日 15:52/ 0 赞/ 844 阅读
还没有评论,来说两句吧...