本文针对上一篇《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缓存锁,防止多个事务同时更新一个数据,如果有其他的解决方法,欢迎大家留言讨论;
而锁冲突中,有一类很经典的场景经常会拿出来讨论:死锁。最近刚好也遇到了一个典型的死锁案例,本文会基于这个案例,做一次详细的分析与拆解。...问题描述 细节信息已脱敏,由于innodb engine status会记录最近一次死锁的细节信息,因此案例现场的信息是可以完整拿到的。...MySQL 不触发死锁回滚,且未进入 lockwait_timeout 的时候,具备这个条件。 不剥夺条件:已获得的资源,在末使用完之前,不能强行剥夺。 MySQL 的锁机制天然具备这个条件。...而 trx2 持有的锁信息中,第一个刚好就是 trx1 等待的: [trx2 持有的锁] 那么关于这个死锁案例的具体场景,就可以用下有向环的图例进行说明: [死锁图例] 至此为止,这个死锁的案例分析就完成了...当然,在实际的业务环境中,可能还会有更复杂和隐蔽的死锁案例,但是不论多么隐蔽和复杂,死锁分析的思路和步骤都是相似的。
---一 背景死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。本次分享的一个死锁案例是 涉及通过辅助索引的更新以及通过主键删除导致的死锁。...希望能够对想了解死锁的朋友有所帮助。二 案例分析2.1 业务逻辑select for update 表记录并加上 x 锁,查询数据,做业务逻辑处理,然后删除该记录。...2.6 如何解决本文中死锁的原因是因为 sess2 通过辅助索引进行更新,因此推荐的避免死锁方案是把sess2 使用辅助索引的更新改成基于主键进行更新,从而避免申请idx_c1上的加锁造成循环等待产生死锁...三 小结敲黑板 ,重点: 死锁是因为不同事务对表记录加锁的顺序不一致导致相互等待对方持有的锁导致的。大家在分析死锁的时候能基于该原则去分析理清业务的sql 逻辑,基本上都能解决大部分的问题场景。...另外文章的最后我们再次复习一下 MySQL 的加几个基本原则,方便大家后面遇到死锁案例进行分析:原则 1:加锁的基本单位是 next-key lock。原则 2:查找过程中访问到的对象才会加锁。
问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常,如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException...原因分析 mysql的事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,更新时采用的是行级锁。这里采用的是INNODB做存储引擎,意味着会将update语句做为一个事务来处理。...蛋疼的情况出现了,一条语句获取了idx_1上的锁,等待主键索引上的锁;另一条语句获取了主键上的锁,等待idx_1上的锁,这样就出现了死锁。...中,更新操作默认会加行级锁,行级锁是基于索引的,在分析死锁之前需要查询一下mysql的执行计划,看看是否用到了索引,用到了哪个索引,对于没有用索引的操作会采用表级锁。...在并发度高的应用中,批量更新一定要带上记录的主键,优先获取主键上的锁,这样可以减少死锁的发生。
---一 背景死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。...本次分享的死锁案例是 更新不存在的记录加上 X GAP lock 和 insert 的意向锁冲突。希望能够对想了解死锁的朋友有所帮助。...二 案例分析2.1 业务逻辑业务逻辑: 业务需要并发不同数据(insert+update),首先是更新记录,如果发现更新的 affect rows 为0,然后就执行插入,如果插入失败,再执行更新。...小结敲黑板 ,重点: 死锁是因为不同事务对表记录加锁的顺序不一致导致相互等待对方持有的锁导致的。大家在分析死锁的时候能基于该原则去分析理清业务的sql 逻辑和执行顺序,基本上都能解决大部分的问题场景。...另外文章的最后我们再次复习一下 MySQL 的加几个基本原则,方便大家后面遇到死锁案例进行分析:原则 1:加锁的基本单位是 next-key lock。原则 2:查找过程中访问到的对象才会加锁。
最近花了些时间分析MySQL锁的内容,觉得越看越有意思。 我有个学习的习惯,有时候也不知道好还是不好,那就是喜欢直接上手练习,然后反过来练习理论。...两个死锁的小例子: 死锁案例1 比如自增列的死锁,一般的死锁得是4条DML语句互相牵制,我们可以做整合,简化,使得死锁的场景变得复杂起来。我们简单来模拟一下。...values(null,10); #session2 insert into t8 values(null,10); #session1 insert into t8 values(null,9); 死锁案例...2 比如我们难度升级,两条delete语句导致的死锁。...transaction mysql>
最近总结了一波死锁问题,和大家分享一下,我这也是从网上各种浏览博客得来,希望原作者见谅,参考博客文末下方。 Mysql 锁类型和加锁分析 MySQL有三种锁的级别:页级、表级、行级。...那么对应的解决死锁问题的关键就是:让不同的session加锁有次序 产生示例 案例一 需求:将投资的钱拆成几份随机分配给借款人。...因为insert语句对于主键来说,插入的行不管有没有存在,都会只有行锁 案例三 mysql> select * from t3 where id=9 for update; +----+--------...一般的情况,两个session分别通过一个sql持有一把锁,然后互相访问对方加锁的数据产生死锁。 案例五 ? 两个单条的sql语句涉及到的加锁数据相同,但是加锁顺序不同,导致了死锁。...这第二种情况,也是”润洁”同学给出的死锁用例中,使用MySQL 5.6.15版本测试出来的死锁产生的原因。
最近总结了一波死锁问题,和大家分享一下,我这也是从网上各种浏览博客得来,希望原作者见谅,参考博客文末下方。 Mysql 锁类型和加锁分析 MySQL有三种锁的级别:页级、表级、行级。...那么对应的解决死锁问题的关键就是:让不同的session加锁有次序 产生示例 案例一 需求:将投资的钱拆成几份随机分配给借款人。...因为insert语句对于主键来说,插入的行不管有没有存在,都会只有行锁 案例三 mysql> select * from t3 where id=9 for update; +----+--------...案例四 一般的情况,两个session分别通过一个sql持有一把锁,然后互相访问对方加锁的数据产生死锁。 案例五 两个单条的sql语句涉及到的加锁数据相同,但是加锁顺序不同,导致了死锁。...这第二种情况,也是”润洁”同学给出的死锁用例中,使用MySQL 5.6.15版本测试出来的死锁产生的原因。
最近总结了一波死锁问题。 ? 生活中,最常见的案例之一,十字路口没有红绿灯,到了十字路口相互不让,最后,整个马路瘫痪,在我们技术层面称之为死锁。 产生死锁的必要条件 1....那么对应的解决死锁问题的关键就是:让不同的session加锁有次序 产生示例 案例一 需求:将投资的钱拆成几份随机分配给借款人。...因为insert语句对于主键来说,插入的行不管有没有存在,都会只有行锁 案例三 mysql> select * from t3 where id=9 for update; +----+--------...一般的情况,两个session分别通过一个sql持有一把锁,然后互相访问对方加锁的数据产生死锁。 ? 案例五 图片 两个单条的sql语句涉及到的加锁数据相同,但是加锁顺序不同,导致了死锁。...这第二种情况,也是”润洁”同学给出的死锁用例中,使用MySQL 5.6.15版本测试出来的死锁产生的原因。
某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。 主要点: 过多的同步可能造成相互不释放资源。 从而互相等待,一般发生于同步中持有多个对象的锁。...this.girl = girl; } @Override public void run() { // 化妆 markup(); } 3、死锁的产生位置...// 相互持有对方的对象锁--》可能造成死锁 private void markup() { if (choice == 0) { synchronized (lipStick...synchronized (lipStick){ System.out.println(this.girl+"涂口红"); } } } } 4、死锁的解决...将获取锁的代码往外面移动一个,使先完成照镜子的动作后,进入线程等待(等待获取口红的状态)。
背景死锁是每个 MySQL DBA 都经常会遇到的问题,之前也写过关于死锁的详细解析。多数时候死锁容易在 update 中发生,且一般是涉及到二级索引。...而本次遇到的问题是发生在 insert 上的死锁,与常规的场景不太一样,因此单独拿出来分析一下。...问题描述细节信息已脱敏,死锁信息来自于搭建的测试环境,使用的是腾讯云数据库 MySQL,版本为 5.7.18-txsql-log 20211031。...锁等待的有向图如下:图片因此这个 insert 中额外获取的锁导致了这个 delete+insert 的事务发生了死锁。...拓展一下从一般的角度来考虑,这个额外的 S 锁似乎是不必要的,所以仔细搜索一下 MySQL bug 的信息,发现一个远古时代的 bug 单:Unexplainable InnoDB unique index
一 前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。...二 案例分析 2.1 业务场景 业务上2条update语句,每条更新多行导致死锁。 2.2 环境说明 MySQL 5.7.22 事务隔离级别为RC模式。...这个死锁案例比较特别2个事务各只有一条update导致死锁。...三 小结 MySQL是否会发生死锁,并不在于事务中有多少条SQL语句,而是在于:两个(或以上)的Session加锁的顺序不一致。分析死锁要充分理解死锁日志,遇到比较难的场景,可以根据核心信息多做推测。...死锁系列我已经写了差将近20篇文章了,包括死锁日志分析,insert加锁,还有十几篇案例分析,等收集完20篇案例,除非遇到特别有意思的案例,就封笔不写喽。
文章目录 1、什么是死锁 2、产生死锁的原因 3、死锁演示 4、验证是否是死锁 1、什么是死锁 两个或两个以上进程在执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,它们无法再执行下去...2、产生死锁的原因 系统资源不足 进程运行推进顺序不合适 资源分配不当 3、死锁演示 import java.util.concurrent.TimeUnit; /** * 演示死锁 */ public...Thread.currentThread().getName()+" 获取锁a"); } } },"B").start(); } } 4、验证是否是死锁...可以使用jps命令查看进程,再用jvm自带的堆栈跟踪工具jstack查看 可以看到需要验证的进程id为10840 然后执行命令jstack 10840 可以看到 B持有锁b 试图获取锁
关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助 二案例分析 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 解决方法 本质上是并发操作相邻记录导致死锁。和开发沟通,将业务逻辑做修改,如果发现录入的商品记录数和存在的记录数一样就做更新,不存在的则直接写入。
本文由高鹏投稿 ,文章末尾有他著作的《深入理解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 主从原理的朋友不容错过。
在项目中,用GCD的时候非常多,但是我最近脑子里一直在问自己一个问题,死锁是什么。惭愧的是这个当初清晰的概念现在愈加模糊,考虑到自己并没有专门整理过死锁的文章,所以写一篇技术文章来帮助自己梳理概念。...死锁的具体案例 接下来所有的案例代码,我都会用Swift3的语言重写一遍,为了帮助自己加深对Swift3的语言的理解。...分析: 这个案例没有使用系统提供的串行或并行队列,而是自己通过dispatch_queue_create函数创建了一个DISPATCH_QUEUE_SERIAL的串行队列。...分析: 和上面几个案例的分析类似,先来看看都有哪些任务加入了Main Queue:【异步线程、任务4、死循环、任务5】。...总结 在总结完这些GCD死锁的情况的以后,我觉得脑子里关于GCD中死锁的概念也逐渐清晰了。以后在项目中也会运用的时候也会更加注意。
1.死锁的概念 死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的。 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。...发生死锁会返回ERROR:1213 错误提示,大部分的死锁InnoDB存储引擎本身可以侦测到,不需要人为进行干预。...注意: InnoDB存储引擎并不会回滚大部分的错误异常,像阻塞章节里面的例子,但是死锁例外,发现死锁后,InnoDB存储引擎会马上回滚一个事务,会返回1213错误。...这是对同一个字段的锁的申请是需要排队的。S锁前面还有一个未申请成功的X锁,所以S锁必须等待,所以形成了循环等待,死锁出现了。...通过阅读死锁日志,我们可以清楚地知道两个事务形成了怎样的循环等待,再加以分析,就可以逆向推断出循环等待的成因,也就是死锁形成的原因。
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务视图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源,也会产生死锁。...两个事务都执行了第一条UPDATE语句,更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条UPDATE语句,却发现该行已经被对方锁定,然后那个事务都等待对方释放锁,同时又持有对方需要的锁...除非有外部因素介入才可能解除死锁。 死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。对于事务型的系统,这是无法避免的,所以应用程序在设计时必须考虑如何处理死锁。...大多数情况下只需要重新执行因死锁回滚的事务即可。
一 前言 死锁其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。...本文是源于生产过程中一个死锁案例。...目前给开发的建议是避免使用replace into方式,使用单条 select 检查 + insert的方式 或者如果可以接受一定的死锁,可以减少并发执行改为串行。...五 参考 [1] https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html 中阐述了各种语句的加锁方式,对死锁有兴趣的同学一定不要错过。...p=1312 ---- 其他死锁文章 漫谈死锁 死锁案例之一 死锁案例之二 死锁案例之三 死锁案例之四
一 前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。...二 案例分析 2.1 业务场景 业务开发同学想同步数据,他们的逻辑是通过update 更新操作,如果更新记录返回的affect_rows为0,然后就调用insert语句进行插入初始化。...了解上面的基础知识,我们开始对死锁日志进行分析: T1: sess1 通过唯一键更新数据,由于c2=4 不存在,返回affect row为0,MySQL会申请(3,6)之间的gap锁。...三 小结 最后想说关于解决死锁问题的思路: 1 具备扎实的锁相关的基础知识。...推荐阅读 ---- 如何阅读死锁日志 漫谈死锁 死锁案例之一 死锁案例之二 死锁案例之三 死锁案例之四 死锁案例之五 死锁案例之六
领取专属 10元无门槛券
手把手带您无忧上云