首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL死锁案例分析

本文针对上一篇《MySQL优化案例分享》文章中提到线上业务产生一个死锁问题进行展开讨论,主要针对两个update操作导致死锁场景,借此机会正好总结下MySQL锁及分析下产生死锁原因和解决方案;...首先,针对MySQL中提供锁种类做一个简单总结,关于更多MySQL锁相关内容可参考官方文档; MySQL InnoDB存储引擎提供了如下几种锁: 1、共享/排他锁(S/X锁) 共享锁(S Lock...案例分析 MySQL版本:MySQL 5.7 隔离级别:RC Session1 Session2 T1 begin;select * from locktest where name=’test’ lock...在该场景下,将update操作改为delete会得到同样效果,同样也会产生死锁; 那么为什么会出现死锁呢?...MySQL之上加了一层redis缓存锁,防止多个事务同时更新一个数据,如果有其他解决方法,欢迎大家留言讨论;

2.2K20

MySQL 案例:Update 死锁详解

而锁冲突中,有一类很经典场景经常会拿出来讨论:死锁。最近刚好也遇到了一个典型死锁案例,本文会基于这个案例,做一次详细分析与拆解。...问题描述 细节信息已脱敏,由于innodb engine status会记录最近一次死锁细节信息,因此案例现场信息是可以完整拿到。...MySQL 不触发死锁回滚,且未进入 lockwait_timeout 时候,具备这个条件。 不剥夺条件:已获得资源,在末使用完之前,不能强行剥夺。 MySQL 锁机制天然具备这个条件。...而 trx2 持有的锁信息中,第一个刚好就是 trx1 等待: [trx2 持有的锁] 那么关于这个死锁案例具体场景,就可以用下有向环图例进行说明: [死锁图例] 至此为止,这个死锁案例分析就完成了...当然,在实际业务环境中,可能还会有更复杂和隐蔽死锁案例,但是不论多么隐蔽和复杂,死锁分析思路和步骤都是相似的。

14.4K174
您找到你想要的搜索结果了吗?
是的
没有找到

故障分析 | MySQL死锁案例分析

---一 背景死锁,其实是一个很有意思也很有挑战技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。本次分享一个死锁案例是 涉及通过辅助索引更新以及通过主键删除导致死锁。...希望能够对想了解死锁朋友有所帮助。二 案例分析2.1 业务逻辑select for update 表记录并加上 x 锁,查询数据,做业务逻辑处理,然后删除该记录。...2.6 如何解决本文中死锁原因是因为 sess2 通过辅助索引进行更新,因此推荐避免死锁方案是把sess2 使用辅助索引更新改成基于主键进行更新,从而避免申请idx_c1上加锁造成循环等待产生死锁...三 小结敲黑板 ,重点: 死锁是因为不同事务对表记录加锁顺序不一致导致相互等待对方持有的锁导致。大家在分析死锁时候能基于该原则去分析理清业务sql 逻辑,基本上都能解决大部分问题场景。...另外文章最后我们再次复习一下 MySQL 加几个基本原则,方便大家后面遇到死锁案例进行分析:原则 1:加锁基本单位是 next-key lock。原则 2:查找过程中访问到对象才会加锁。

79930

MySQL批量更新死锁案例分析

问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常,如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException...原因分析 mysql事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,更新时采用是行级锁。这里采用是INNODB做存储引擎,意味着会将update语句做为一个事务来处理。...蛋疼情况出现了,一条语句获取了idx_1上锁,等待主键索引上锁;另一条语句获取了主键上锁,等待idx_1上锁,这样就出现了死锁。...中,更新操作默认会加行级锁,行级锁是基于索引,在分析死锁之前需要查询一下mysql执行计划,看看是否用到了索引,用到了哪个索引,对于没有用索引操作会采用表级锁。...在并发度高应用中,批量更新一定要带上记录主键,优先获取主键上锁,这样可以减少死锁发生。

2.1K40

故障分析 | MySQL死锁案例分析

---一 背景死锁,其实是一个很有意思也很有挑战技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。...本次分享死锁案例是 更新不存在记录加上 X GAP lock 和 insert 意向锁冲突。希望能够对想了解死锁朋友有所帮助。...二 案例分析2.1 业务逻辑业务逻辑: 业务需要并发不同数据(insert+update),首先是更新记录,如果发现更新 affect rows 为0,然后就执行插入,如果插入失败,再执行更新。...小结敲黑板 ,重点: 死锁是因为不同事务对表记录加锁顺序不一致导致相互等待对方持有的锁导致。大家在分析死锁时候能基于该原则去分析理清业务sql 逻辑和执行顺序,基本上都能解决大部分问题场景。...另外文章最后我们再次复习一下 MySQL 加几个基本原则,方便大家后面遇到死锁案例进行分析:原则 1:加锁基本单位是 next-key lock。原则 2:查找过程中访问到对象才会加锁。

72940

这六个 MySQL 死锁案例,能让你理解死锁原因!

最近总结了一波死锁问题,和大家分享一下,我这也是从网上各种浏览博客得来,希望原作者见谅,参考博客文末下方。 Mysql 锁类型和加锁分析 MySQL有三种锁级别:页级、表级、行级。...那么对应解决死锁问题关键就是:让不同session加锁有次序 产生示例 案例一 需求:将投资钱拆成几份随机分配给借款人。...因为insert语句对于主键来说,插入行不管有没有存在,都会只有行锁 案例mysql> select * from t3 where id=9 for update; +----+--------...一般情况,两个session分别通过一个sql持有一把锁,然后互相访问对方加锁数据产生死锁案例五 ? 两个单条sql语句涉及到加锁数据相同,但是加锁顺序不同,导致了死锁。...这第二种情况,也是”润洁”同学给出死锁用例中,使用MySQL 5.6.15版本测试出来死锁产生原因。

93540

这六个 MySQL 死锁案例,能让你理解死锁原因!

最近总结了一波死锁问题,和大家分享一下,我这也是从网上各种浏览博客得来,希望原作者见谅,参考博客文末下方。 Mysql 锁类型和加锁分析 MySQL有三种锁级别:页级、表级、行级。...那么对应解决死锁问题关键就是:让不同session加锁有次序 产生示例 案例一 需求:将投资钱拆成几份随机分配给借款人。...因为insert语句对于主键来说,插入行不管有没有存在,都会只有行锁 案例mysql> select * from t3 where id=9 for update; +----+--------...案例四 一般情况,两个session分别通过一个sql持有一把锁,然后互相访问对方加锁数据产生死锁案例五 两个单条sql语句涉及到加锁数据相同,但是加锁顺序不同,导致了死锁。...这第二种情况,也是”润洁”同学给出死锁用例中,使用MySQL 5.6.15版本测试出来死锁产生原因。

39610

我通过六个 MySQL 死锁案例,终于理解了死锁原因

最近总结了一波死锁问题。 ? 生活中,最常见案例之一,十字路口没有红绿灯,到了十字路口相互不让,最后,整个马路瘫痪,在我们技术层面称之为死锁。 产生死锁必要条件 1....那么对应解决死锁问题关键就是:让不同session加锁有次序 产生示例 案例一 需求:将投资钱拆成几份随机分配给借款人。...因为insert语句对于主键来说,插入行不管有没有存在,都会只有行锁 案例mysql> select * from t3 where id=9 for update; +----+--------...一般情况,两个session分别通过一个sql持有一把锁,然后互相访问对方加锁数据产生死锁。 ? 案例五 图片 两个单条sql语句涉及到加锁数据相同,但是加锁顺序不同,导致了死锁。...这第二种情况,也是”润洁”同学给出死锁用例中,使用MySQL 5.6.15版本测试出来死锁产生原因。

77631

MySQL案例:insert死锁与唯一索引

背景死锁是每个 MySQL DBA 都经常会遇到问题,之前也写过关于死锁详细解析。多数时候死锁容易在 update 中发生,且一般是涉及到二级索引。...而本次遇到问题是发生在 insert 上死锁,与常规场景不太一样,因此单独拿出来分析一下。...问题描述细节信息已脱敏,死锁信息来自于搭建测试环境,使用是腾讯云数据库 MySQL,版本为 5.7.18-txsql-log 20211031。...锁等待有向图如下:图片因此这个 insert 中额外获取锁导致了这个 delete+insert 事务发生了死锁。...拓展一下从一般角度来考虑,这个额外 S 锁似乎是不必要,所以仔细搜索一下 MySQL bug 信息,发现一个远古时代 bug 单:Unexplainable InnoDB unique index

3.7K92

死锁案例十五

一 前言 死锁,其实是一个很有意思也很有挑战技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列案例分析,希望能够对想了解死锁朋友有所帮助。...二 案例分析 2.1 业务场景 业务上2条update语句,每条更新多行导致死锁。 2.2 环境说明 MySQL 5.7.22 事务隔离级别为RC模式。...这个死锁案例比较特别2个事务各只有一条update导致死锁。...三 小结 MySQL是否会发生死锁,并不在于事务中有多少条SQL语句,而是在于:两个(或以上)Session加锁顺序不一致。分析死锁要充分理解死锁日志,遇到比较难场景,可以根据核心信息多做推测。...死锁系列我已经写了差将近20篇文章了,包括死锁日志分析,insert加锁,还有十几篇案例分析,等收集完20篇案例,除非遇到特别有意思案例,就封笔不写喽。

73810

死锁案例十三

关于死锁我会持续写一个系列案例分析,希望能够对想了解死锁朋友有所帮助 二案例分析 2.1 业务场景 用户录入商品,应用程序会提前检查是否存在相同记录,如果有则先删除再插入;如果没有则直接插入。...key(本文案例),对于普通INSERT/UPDATE,会加LOCK_S属性锁next-key lock。...测试案例一 sess1mysql > delete from t where a=3 and b=3 ;Query OK, 1 row affected (0.00 sec)sess2mysql >update...测试案例二 T1 sess1mysql > delete from t where a=3 and b=3 ;mysql > insert into t(a,b,c) values(3,3,5); T2...于是相互等待,发生死锁。 2.7 解决方法 本质上是并发操作相邻记录导致死锁。和开发沟通,将业务逻辑做修改,如果发现录入商品记录数和存在记录数一样就做更新,不存在则直接写入。

58630

死锁案例十四

本文由高鹏投稿 ,文章末尾有他著作《深入理解MySQL主从原理 32讲》,深入透彻理解MySQL主从,GTID相关技术知识。...一、问题由来 这是我同事问我一个问题,在网上看到了如下案例,本案例RC RR都可以出现,其实这个死锁原因也比较简单,我们来具体看看: 构造数据 CREATE database deadlock_test...这个时候S3需要获取唯一键上LOCKX|LOCKNOT_GAP 锁,因此被堵塞了如下图: ? 4. s1(TRX_ID367661) 执行语句 这一步完成后死锁出现。...但是随后s3获取主键上LOCKX|LOCKNOTGAP锁堵塞,s2获取唯一键上LOCKX|LOCKNOTGAP锁堵塞。因此死锁形成,如下图: ? 好了我们看到了死锁就这样出现。...整个分析过程我们只要看到加锁日志实际上很容易就分析得出来。 最后欢迎推荐高鹏专栏《深入理解MySQL主从原理 32讲》,想要透彻了解学习MySQL 主从原理朋友不容错过。

31020

iOS——GCD死锁案例

在项目中,用GCD时候非常多,但是我最近脑子里一直在问自己一个问题,死锁是什么。惭愧是这个当初清晰概念现在愈加模糊,考虑到自己并没有专门整理过死锁文章,所以写一篇技术文章来帮助自己梳理概念。...死锁具体案例 接下来所有的案例代码,我都会用Swift3语言重写一遍,为了帮助自己加深对Swift3语言理解。...分析: 这个案例没有使用系统提供串行或并行队列,而是自己通过dispatch_queue_create函数创建了一个DISPATCH_QUEUE_SERIAL串行队列。...分析: 和上面几个案例分析类似,先来看看都有哪些任务加入了Main Queue:【异步线程、任务4、死循环、任务5】。...总结 在总结完这些GCD死锁情况以后,我觉得脑子里关于GCD中死锁概念也逐渐清晰了。以后在项目中也会运用时候也会更加注意。

1.9K30

MySQLmysql死锁以及死锁日志分析

1.死锁概念 死锁死锁一般是事务相互等待对方资源,最后形成环路造成。 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。...发生死锁会返回ERROR:1213 错误提示,大部分死锁InnoDB存储引擎本身可以侦测到,不需要人为进行干预。...注意: InnoDB存储引擎并不会回滚大部分错误异常,像阻塞章节里面的例子,但是死锁例外,发现死锁后,InnoDB存储引擎会马上回滚一个事务,会返回1213错误。...这是对同一个字段申请是需要排队。S锁前面还有一个未申请成功X锁,所以S锁必须等待,所以形成了循环等待,死锁出现了。...通过阅读死锁日志,我们可以清楚地知道两个事务形成了怎样循环等待,再加以分析,就可以逆向推断出循环等待成因,也就是死锁形成原因。

3.5K41

MySql 死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用资源,从而导致恶性循环现象。当多个事务视图以不同顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源,也会产生死锁。...两个事务都执行了第一条UPDATE语句,更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条UPDATE语句,却发现该行已经被对方锁定,然后那个事务都等待对方释放锁,同时又持有对方需要锁...除非有外部因素介入才可能解除死锁死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。对于事务型系统,这是无法避免,所以应用程序在设计时必须考虑如何处理死锁。...大多数情况下只需要重新执行因死锁回滚事务即可。

1.3K10

死锁案例之五

一 前言 死锁其实是一个很有意思也很有挑战技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列案例分析,希望能够对想了解死锁朋友有所帮助。...本文是源于生产过程中一个死锁案例。...目前给开发建议是避免使用replace into方式,使用单条 select 检查 + insert方式 或者如果可以接受一定死锁,可以减少并发执行改为串行。...五 参考 [1] https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html 中阐述了各种语句加锁方式,对死锁有兴趣同学一定不要错过。...p=1312 ---- 其他死锁文章 漫谈死锁 死锁案例之一 死锁案例之二 死锁案例之三 死锁案例之四

1K40

死锁案例之七

一 前言 死锁,其实是一个很有意思也很有挑战技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列案例分析,希望能够对想了解死锁朋友有所帮助。...二 案例分析 2.1 业务场景 业务开发同学想同步数据,他们逻辑是通过update 更新操作,如果更新记录返回affect_rows为0,然后就调用insert语句进行插入初始化。...了解上面的基础知识,我们开始对死锁日志进行分析: T1: sess1 通过唯一键更新数据,由于c2=4 不存在,返回affect row为0,MySQL会申请(3,6)之间gap锁。...三 小结 最后想说关于解决死锁问题思路: 1 具备扎实锁相关基础知识。...推荐阅读 ---- 如何阅读死锁日志 漫谈死锁 死锁案例之一 死锁案例之二 死锁案例之三 死锁案例之四 死锁案例之五 死锁案例之六

47720

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券