最近新项目上线,在压测和发布生产都出现了好几种死锁情况,分析一二 死锁日志 日志一: ? 日志二: ? 日志三: ?...但在程序处理时这条SQL的where条件一样而已 分析 隔离级别RC 日志一,where里面的条件不同 第一个事务在等待RECORD LOCKS,锁模式为X model;位置在space id 428...索引上看使用idx_tenant_user,也与死锁日志一致,但怎么就死锁了呢?...原来线上使用的index merge 有官网上有介绍:https://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html MySQL在分析执行计划时发现走单个索引的过滤效果都不是很好...解决 建立联合索引 都使用主键更新 关掉参数index_merge_intersection=off,禁用index_merge功能 参照 MySQL 优化之 index_merge 一个 MySQL 死锁案例分析
根据上一篇【死锁分析】,又重新梳理了一下,画图表示更形象一些 【使用电脑阅读更佳】 事务 1 事务 2 - begin begin delete id=1;(1)id加锁、(2)A加锁 delete id...;如果先走(tenantid,userid) 则是日志一 先走no,则是日志二 索引交叉,则是日志三 最近借着死锁事项,又温习了部分数据库的理论知识,后面有时间再整理。...现在的程序员真难,得上知天文,下知地理;这应该是DBA的专长,作为开发也得去深究,真难 在追查死锁的过程中,对照理论有一些实践,总结一下: 查看事务自动提交选项 show session variables...gap 其实不仅会在主键加X,还会在二级索引上也加X,但没有显示出来;这儿跟delete一样,其实也是个隐式锁 模拟测试了一下,两条sql,一条根据二级索引删除操作、另一条使用主键更新记录模拟并发死锁
这里就介绍一下对MySQL死锁的理解,并提出一个基于审计日志分析死锁的方法。 一、死锁场景 我们创建一个最简单的死锁场景 1....所以存在死锁。 在MySQL中,当开启死锁检测时,即innodb_deadlock_detect设置为ON时,每个事务请求锁并发生锁等待的时候,都会进行死锁检测。...四、如何分析死锁 通常的分析,都是看死锁日志,在结合业务执行的逻辑进行分析。如果只是上文中的简单case,还是比较容易的。...但复杂的,多个事务相互依赖的情况,通过死锁日志提供的信息,再加上当时分析业务逻辑,可能也不是很容易。 五、通过审计日志分析死锁 分析死锁的根本目标,是找到业务如何执行SQL,构成死锁的。...通过分析innodb_lock_waits+innodb_trx中的信息,可以得到造成死锁的SQL信息。 另外一种是解析法。
1.死锁的概念 死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的。 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。...发生死锁会返回ERROR:1213 错误提示,大部分的死锁InnoDB存储引擎本身可以侦测到,不需要人为进行干预。...18514656666' where mobile='18514656620'; 空 5 空 delete from info_area where id=1; image.png image.png 分析死锁日志...uid='bbb';等待 空 4 ERROR 1213 (40001) insert INTO users VALUES(2,'bbb'); 成功 image.png image.png 分析死锁日志...通过阅读死锁日志,我们可以清楚地知道两个事务形成了怎样的循环等待,再加以分析,就可以逆向推断出循环等待的成因,也就是死锁形成的原因。
任何数据库都有死锁,MYSQL的死锁有相关的工具,或者去日志查找,postgresql的死锁又怎么搞,今天的来说说。...这三个里面的设置,死锁的检测一定是要设置的,因为死锁被发现时,最好是尽快的通过系统检测到后,尽快的解除(牺牲一个)。保证系统正常的运行,尤其在OLTP的系统中。...OK 我们先来看一下什么是死锁,这里我们稍微的把死锁的鉴定的时间调大一点,好来给执行发现死锁的语句一点时间,我们将deadlock_timeout 设置为 20秒,当然如果是生产系统,你这样做,呵呵 你还想干吗...系统会给出死锁的信息以及相关解决的信息,当然如果在死锁期间,通过语句你也是可以发现相关的死锁信息的。 ?...说完简单的分析,还的找一期来说说,怎么避免死锁。
1.背景概述 客户业务发生死锁的报错,根据业务程序日志及业务流程,发现造成死锁的原因是:事务1 delete + insert ,事务2 delete + insert 2个事务交替执行导致的死锁;由于...GAP锁阻塞了插入意向锁,并且当delete的数据存在时死锁不会发生,当delete的数据不存在时,会发生死锁。...9 | +------+------+------+------+ 4 rows in set (0.01 sec) 2.2 事务执行顺序 按以下事务执行顺序,如果要删除的数据存在,则不会发生死锁...;如果要删除的数据不存,并且要删除的数据在同一个GAP锁的区间内则会发生死锁; 时间事务1事务2T1BEGIN;BEGIN;T2delete from test where c1=?...3.总结 此次死锁的发生主要是GAP 锁 和 插入意向锁的冲突,建议让业务修改一下逻辑,先判断数据是否存在 select 一下,存在的话 delete 后在 insert ; 不存在的话直接 insert
本文针对上一篇《MySQL优化案例分享》文章中提到的线上业务产生的一个死锁问题进行展开讨论,主要针对两个update操作导致的死锁的场景,借此机会正好总结下MySQL锁及分析下产生死锁的原因和解决方案;...案例分析 MySQL版本:MySQL 5.7 隔离级别:RC Session1 Session2 T1 begin;select * from locktest where name=’test’ lock...,回滚] 死锁日志: ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2021-04-30 17:...那么我们通过对上述操作,结合死锁日志进行分析: Session1的lock in share mode获取到S锁(lock mode S locks rec but not gap),Session1的...在该场景下,将update操作改为delete会得到同样的效果,同样也会产生死锁; 那么为什么会出现死锁呢?
---一 背景死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。本次分享的一个死锁案例是 涉及通过辅助索引的更新以及通过主键删除导致的死锁。...希望能够对想了解死锁的朋友有所帮助。二 案例分析2.1 业务逻辑select for update 表记录并加上 x 锁,查询数据,做业务逻辑处理,然后删除该记录。...heap no 8 PHYSICAL RECORD: n_fields 2; compact format; info bits 0*** WE ROLL BACK TRANSACTION (2)2.5 死锁分析...三 小结敲黑板 ,重点: 死锁是因为不同事务对表记录加锁的顺序不一致导致相互等待对方持有的锁导致的。大家在分析死锁的时候能基于该原则去分析理清业务的sql 逻辑,基本上都能解决大部分的问题场景。...另外文章的最后我们再次复习一下 MySQL 的加几个基本原则,方便大家后面遇到死锁案例进行分析:原则 1:加锁的基本单位是 next-key lock。原则 2:查找过程中访问到的对象才会加锁。
本次分享的死锁案例是 更新不存在的记录加上 X GAP lock 和 insert 的意向锁冲突。希望能够对想了解死锁的朋友有所帮助。...二 案例分析2.1 业务逻辑业务逻辑: 业务需要并发不同数据(insert+update),首先是更新记录,如果发现更新的 affect rows 为0,然后就执行插入,如果插入失败,再执行更新。...heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0*** WE ROLL BACK TRANSACTION (2)2.5 死锁分析...小结敲黑板 ,重点: 死锁是因为不同事务对表记录加锁的顺序不一致导致相互等待对方持有的锁导致的。大家在分析死锁的时候能基于该原则去分析理清业务的sql 逻辑和执行顺序,基本上都能解决大部分的问题场景。...另外文章的最后我们再次复习一下 MySQL 的加几个基本原则,方便大家后面遇到死锁案例进行分析:原则 1:加锁的基本单位是 next-key lock。原则 2:查找过程中访问到的对象才会加锁。
等待链 A被C堵塞,C被B堵塞,B被A堵塞 等待链分析: A执行到语句3了,说明主键为orderno_a的order数据行锁和ch1的channel数据行锁已经获取到了,而其余的B和C只能等待该ch1...死锁分析 要分析这个死锁就要明白等待事件enq: TX - allocate ITL entry所代表的资源itl事务槽的含义。itl事务槽是数据块头中用来标记事务的记录。在这里有个重点是 数据块 。...这就是这个死锁的关键点。当然不同表的事务肯定跨数据块了,一个事务即使修改一个表的多条数据也可能跨块了。...完成了锁的闭环 到此死锁分析完毕。...将会发生行迁移 update t_order set mesg=(select rpad('b',3000,'b') from dual) where mesg like 'b%'; --可以使用以下语句分析行迁移的表
最近业务上连续出现了两次死锁逻辑,两次都是特别简单的SQL语句,分析后才发现自己对InnoDB加锁了解得太浅了。...format; info bits 0 0: len 8; hex 73757072656d756d; asc supremum;; *** WE ROLL BACK TRANSACTION (2) 死锁分析...死锁!...死锁场景二 SQL语句 insert into user(`name`) values('tenmao'); 死锁分析 T1 T2 insert into user(`name`) values('tenmao...等待T2释放S锁(死锁) 参考 解决死锁之路(终结篇) - 再见死锁 The Infimum and Supremum Records https://github.com/aneasystone/mysql-deadlocks
一小伙说他的程序死锁了,让帮忙看看。对死锁问题,首先祭出GDB这一神器。...#4 0x08316692 in mooon::sys::CLock::lock (this=0x89f59e0) 第一步的目标是找到锁被谁持有了,这只需要找到死锁的位置
概述 最近遇到一个生产环境的问题,报错如下: 事务(进程 ID 89)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。...分析了下代码,主要的部分是包裹在事务中,且给主要的数据更新加了数据库资源锁。...报错时有抓到报错的语句,分析了下,是更新某张表的字段时,报错的。一开始一直在分析代码层面,但是始终没思路。后台和同事分析了下报错的SQL语句。...一旦更新时间长,且SQL阻塞了,就会有死锁的问题。 解决 既然是SQL更新问题,那么第一查看的应该是索引。...如果遇到死锁的问题,分析了代码,的确没问题。可以考虑导致死锁的语句会不会有性能问题,从索引着手。
创建死锁情景 我们先创建一个发生死锁的情景,在Session A和Session B中分别执行两个事务,具体情况如下: 我们分析一下: 从第③步中可以看出,Session A中的事务先对hero表聚簇索引的...lock; try restarting transaction 以上是我们从语句加了什么锁的角度出发来进行死锁情况分析的,但是实际应用中我们可能压根儿不知道到底是哪几条语句产生了死锁,我们需要根据MySQL...,所以就把以LATEST DETECTED DEADLOCK这一部分给单独提出来分析一下。...思索分析的思路 查看死锁日志时,首先看一下发生死锁的事务等待获取锁的语句都是啥。...找到发生死锁的事务中所有的语句之后,对照着事务获取到的锁和正在等待的锁的信息来分析死锁发生过程。
问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常,如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException...原因分析 mysql的事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,更新时采用的是行级锁。这里采用的是INNODB做存储引擎,意味着会将update语句做为一个事务来处理。...蛋疼的情况出现了,一条语句获取了idx_1上的锁,等待主键索引上的锁;另一条语句获取了主键上的锁,等待idx_1上的锁,这样就出现了死锁。...status.setRollbackOnly(); return e; } } }); 小结:在采用INNODB的MySQL中,更新操作默认会加行级锁,行级锁是基于索引的,在分析死锁之前需要查询一下...在并发度高的应用中,批量更新一定要带上记录的主键,优先获取主键上的锁,这样可以减少死锁的发生。
. ---- Dead Lock 分析 jstack 杀出来的线程堆栈, 划重点~~~ Found one Java-level deadlock: ==========================...---- 分析代码 T-ShortConn-0 持有的lock 【0x00000006cc86c090】 那就去dump中查找这个关键字吧 ?
// insert on duplicate key死锁问题分析 // 开始今天的文章之前,先说明下昨天文章中的一个错误,昨天文章最后说replace into带来的死锁问题可以使用insert...into duplicate key update的方法来解决,今天实际测试的时候,还是遇到了一些问题,改方法并没有完全解决死锁的问题,来看测试的结果。...死锁信息对应的命令行输出如下: mysql:yeyztest 22:14:18>>begin; Query OK, 0 rows affected (0.00 sec) mysql:yeyztest 22...该网址上面的例子,几乎完整的复现了上述死锁的情况,就是说,加入有两条并发的insert操作要对同一条记录加共享锁,而此时这条记录又被其他事务加上了排它锁,当排它锁的事务回滚或者提交之后,两个并发的insert...操作是会发生死锁的,原因是由于这两条并发的insert操作,都对这条记录加上了共享锁,所以都无法获取该条记录的排它锁,除非一条insert语句回滚。
本文先说说死锁。...想想,“中国学生”的思路就是“序列化执行”,而外国学生的现象就是因为“竞争”而导致了“死锁”。 回到正题,我想熟悉计算机的同学应该对“死锁”这个概念并不陌生。...它们就死锁了。...最后说一下,此处的FunA1(),FunB1()并不影响死锁产生的结果,但是会影响死锁产生的概率。 ? ...请大家记住这两个例子,我们会在之后分析的DllMain中不当操作导致死锁的案例中再次看到它们的身影。
在 Google 上查询相关的情况,发现这个问题很大可能跟从库并行回放发生死锁有关,而且还有可能涉及到 MySQL 的 BUG。...---- 那么对于 MySQL 来说,发生这种情况,不会自动触发 InnoDB 的死锁检测来回滚事务吗?...为什么在这个一主两从中,只有这个延迟从库发生了死锁的问题,另外一个正常复制的从库没有死锁呢?...实际上,后面这个正常复制的从库也出现了死锁的情况。...如果不要求从库执行事务顺序与主库一致,可以设置 slave_preserve_commit_order = off 来避免死锁的出现。
1.背景概述 客户业务发生死锁的报错,根据业务程序日志及业务流程,发现造成死锁的原因是:事务1 delete + insert ,事务2 delete + insert,这两个事务交替执行导致的死锁;...由于GAP锁阻塞了插入意向锁,并且当delete的数据存在时死锁不会发生,当delete的数据不存在时,会发生死锁。...9 | +------+------+------+------+ 4 rows in set (0.01 sec) 2.2 事务执行顺序 按以下事务执行顺序,如果要删除的数据存在,则不会发生死锁...;如果要删除的数据不存,并且要删除的数据在同一个GAP锁的区间内则会发生死锁; 时间事务1事务2T1BEGIN;BEGIN;T2delete from test where c1=?...3.总结 此次死锁的发生主要是GAP 锁 和 插入意向锁的冲突,建议让业务修改一下逻辑,先判断数据是否存在 select 一下,存在的话 delete 后在 insert ; 不存在的话直接 insert
领取专属 10元无门槛券
手把手带您无忧上云