mysql先删后增并发时出现死锁_MySQL死锁案例分析一(先delete,再insert,导致死锁)...

一、死锁案例

MySQL版本:Percona MySQL Server 5.7.19

隔离级别:可重复读(RR)

业务逻辑:并发下按某个索引字段先delete记录,再insert记录

比如:begin;delete from tb where order_id = xxx;insert into tb(order_id) values(xxx);

commit;

二、MySQL锁基本概念

S:共享锁(行级锁)

X:排他锁(行级锁)

IS:意向共享锁(表级锁)

IX:意向排他锁(表级锁)

以上4种锁的兼容性见下表:

AAffA0nNPuCLAAAAAElFTkSuQmCC

锁模式兼容性表gap锁与gap锁之间不冲突

rec insert intention(插入意向锁)与gap锁冲突。

三、模拟复现死锁

打开参数,从innodb status获取更多的锁信息。

set GLOBAL innodb_status_output_locks=ON;

表结构:CREATE TABLE `tb` (  `order_id` int(11) DEFAULT NULL,

KEY `idx_order_id` (`order_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

表中数据:mysql> select * from tb;

+----------+| order_id |+----------+|       10 ||       20 |+----------+2 rows in set (0.00 sec)

事务执行步骤:session1session2begin

begin

delete from tb where order_id=15;

delete from tb where order_id=15;

insert into tb select 15;(等待锁)

insert into tb select 15;(死锁)当session1执行delete from tb where order_id=15;,由于条件order_id=15的记录不存在,session1 获得2个锁结构,分别是意向排他锁IX(表级锁)、gap锁(行级锁),如下:---TRANSACTION 1055191443, ACTIVE 20 sec2 lock struct(s), heap size 1136, 1 row lock(s)

MySQL thread id 315642, OS thread handle 139960342456064, query id 150462030 localhost root

TABLE LOCK table `db`.`tb` trx id 1055191443 lock mode IX

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191443 lock_mode X locks gap before rec当session2执行delete from tb where order_id=15;,同样由于order_id=15的记录不存在,session2 也获得2个锁结构,分别是意向排他锁IX(表级锁)、gap锁(行级锁),如下:---TRANSACTION 1055191444, ACTIVE 3 sec2 lock struct(s), heap size 1136, 1 row lock(s)

MySQL thread id 315336, OS thread handle 139960562685696, query id 150462412 localhost root

TABLE LOCK table `db`.`tb` trx id 1055191444 lock mode IX

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191444 lock_mode X locks gap before rec当session2执行insert into tb select 15;, session2 已经获取到IX锁,gap锁,等待 rec insert intention(插入意向锁)---TRANSACTION 1055191444, ACTIVE 68 sec inserting

mysql tables in use 1, locked 1LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1MySQL thread id 315336, OS thread handle 139960562685696, query id 150462778 localhost root executing

insert into tb select 15------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191444 lock_mode X locks gap before rec insert intention waiting

------------------

TABLE LOCK table `db`.`tb` trx id 1055191444 lock mode IX

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191444 lock_mode X locks gap before rec

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191444 lock_mode X locks gap before rec insert intention waiting当session1执行insert into tb select 15;,session1 已获取到IX锁,gap锁, 等待rec insert intention(插入意向锁), session1, session2 都在等待插入意向锁, 插入意向锁与gap锁冲突,双方都没有释放gap锁,又都在等待插入意向锁,死锁发生。LATEST DETECTED DEADLOCK

------------------------2018-11-03 17:15:11 0x7f4b0e7ea700*** (1) TRANSACTION:

TRANSACTION 1055191444, ACTIVE 135 sec inserting

mysql tables in use 1, locked 1LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1MySQL thread id 315336, OS thread handle 139960562685696, query id 150462778 localhost root executing

insert into tb select 15*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191444 lock_mode X locks gap before rec insert intention waiting

*** (2) TRANSACTION:

TRANSACTION 1055191443, ACTIVE 201 sec inserting, thread declared inside InnoDB 5000mysql tables in use 1, locked 13 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1MySQL thread id 315642, OS thread handle 139960342456064, query id 150463172 localhost root executing

insert into tb select 15*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191443 lock_mode X locks gap before rec

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191443 lock_mode X locks gap before rec insert intention waiting

*** WE ROLL BACK TRANSACTION (2)

四、案例扩展

以上死锁案例,业务代码逻辑是多线程并发下,有可能多个线程会执行相同order_id的job,比如两个线程执行的order_id 都是15。

另外一种情况,多个线程间,不会执行到相同order_id的情况,也可能发生死锁。比如一个线程order_id=15,另外一个线程order_id=16,如下所示:

事务执行步骤:session1session2begin

begin

delete from tb where order_id=15;

delete from tb where order_id=16;

insert into tb select 16;(等待锁)

insert into tb select 15;(死锁)

锁情况与上述相同,不再赘述,死锁信息如下:LATEST DETECTED DEADLOCK

------------------------2018-11-03 17:28:30 0x7f4b0e667700*** (1) TRANSACTION:

TRANSACTION 1055191450, ACTIVE 18 sec inserting

mysql tables in use 1, locked 1LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1MySQL thread id 316221, OS thread handle 139960338228992, query id 150467652 localhost root executing

insert into tb select 16*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191450 lock_mode X locks gap before rec insert intention waiting

*** (2) TRANSACTION:

TRANSACTION 1055191449, ACTIVE 28 sec inserting, thread declared inside InnoDB 5000mysql tables in use 1, locked 13 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1MySQL thread id 316222, OS thread handle 139960340870912, query id 150467681 localhost root executing

insert into tb select 15*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191449 lock_mode X locks gap before rec

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 1337 page no 4 n bits 72 index idx_order_id of table `db`.`tb` trx id 1055191449 lock_mode X locks gap before rec insert intention waiting

*** WE ROLL BACK TRANSACTION (2)

作者:偏执的工匠

链接:https://www.jianshu.com/p/f8495015dace

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经科学领域重大突破,港大科学家揭海马体新功能

来源:神经科技概要:香港大学研究团队在神经科学领域取得重大突破,揭示大脑中一个重要区域 — 海马体的新功能。香港大学研究团队在神经科学领域取得重大突破,揭示大脑中一个重要区域 — 海马体的新功能。团队发现,海马…

python移动平均线绘图_对python pandas 画移动平均线的方法详解

数据文件 66001_.txt 内容格式:date,jz0,jz1,jz2,jz3,jz4,jz52012-12-28,0.9326,0.8835,1.0289,1.0027,1.1067,1.00232012-12-31,0.9435,0.8945,1.0435,1.0031,1.1229,1.00272013-01-04,0.9403,0.8898,1.0385,1.0032,1.1183,1.0030... ...pd_roll_mean1.py# -*- cod…

年度最理性 AI 分析文章:预测 AI 未来,大部分人陷入了 7 大误区

来源:36氪概要:错误的预测会导致大家对不会发生的事情感到恐惧。为什么在人工智能和机器人的预测上总有人不断犯错呢?想着预测未来,却一不小心就陷入了yy。近年来图像识别突破、Waymo无人车上路、Alphago战胜人类冠军等AI的一些标…

python算24点穷举法_关于24点去重的算法?

4月12日更新 先给结论吧 花了近一周时间用JavaScript完成了24点去重算法,源码提交到了github上:auntyellow/24 ,可以在线试:gives you all dissimilar solutions.在1到13范围内的四数组合中,不重复解最多的组合是2、4…

为什么当今的企业都需要人工智能战略?

来源:腾股创投概要:人工智能(AI)从根本上改变了所有行业的企业的运营(包括制造业,医疗健康,信息技术和运输业)。今后5年,会有一些标普500强CEO 后悔没有早点考虑自己的 A…

java邮箱_java发送邮件(qq邮箱)

完整的示例代码:package cn.sw.study.common.test;import javax.mail.Message;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.util.Date;import java.ut…

昆虫大脑帮助AI解决导航难题

原作者:SAKYASINGHADASGUPTA, LEAPMIND INC译者:彭婷概要:无人机和其他自主机器人需要通过移动或其他有效的方案来解决现实生活中的问题,而这些问题有的小到平常的包裹运输,有的大到紧急搜索和救援任务。无人机和其他自…

DeepMind发布《星际争霸 II》深度学习环境

来源:AI 研习社概要:上个月,DeepMind和暴雪终于开源了《星际争霸II 》的机器学习平台。本文介绍了基于星际争霸II游戏的强化学习环境SC2LE(《星际争霸II 》学习环境)。StarCraft II: A New Challenge for Reinforcemen…

java arraylist .get_Java ArrayList get()方法

Java ArrayList get()方法java.util.ArrayList.get(int index) 方法返回在ArrayList中的指定位置的元素。1 语法public E get(int index)2 参数index:要返回的元素的索引。3 返回值返回ArrayList中指定位置的元素。4 示例package com.yiidian;/*** 一点教程网&#…

中国首篇Science机器人子刊!北航软体机器人实验室四年成果登上封面长篇

来源:北航新闻网、机器人大讲堂概要:通过这三项关键技术,我们成功实现了机器人样机能够像真正的䲟鱼一样牢牢吸附在物体表面,并且通过内部鳍片的主动抬起运动显著增大摩擦力。重磅惊喜,北京时间9月21日,国际…

java 控制台输入字符串_Java控制台输入字符串及字符串比较

需求描述:茵茵很喜欢研究车牌号码,从车牌号码上可以看出号码注册的早晚,据研究发现,车牌号码是按字典序发放的,现在她收集了很多车牌号码,请你设计程序帮她判断注册较早的号码。车牌号码由5个字母或数字组成…

DARPA:我们需要一种新型的芯片技术来确保人工智能的长足发展

原文作者:Dom Galeon译者:李凌概要:专家们普遍认为在21世纪20年代摩尔定律将黯然失色。同时,人工智能正在接受的测试要求他们有更强大的处理能力——接近于人脑的处理能力。简介上周三,美国国防部高级研究计划局&#…

java 反射.问题_Java知识点总结(反射-反射机制性能问题)

Java知识点总结(反射-反射机制性能问题)(Java知识点总结)[Java, 反射]性能相关注意点:setAccessible启用和禁用访问安全检查的开关,值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。__并不…

前沿|揭开黑箱:希伯来大学计算机科学教授提出「信息瓶颈」

来源:全球人工智能概要:像大脑一样,深度神经网络也有很多层神经元。当神经元被激活时,它会发出信号,连接上面一层的神经元。如今「深度神经网络」已经学会对话、驾驶汽车、打视频游戏、玩围棋、绘画并辅助科研&#xf…

华为与英特尔开展5G互操作性测试

来源:华为概要:C-Band被认为是首批全球协同频谱之一,将提供5G的基础覆盖和带宽,是5G最主要的频段,也是全球最可能首商用的频段之一。华为与英特尔宣布启动基于3GPP标准的5G新空口互操作性测试(IODT&#xf…

java手机网站开发工具_制作网站常用的网页开发工具有哪些

我们要想制作好网站其实是离不开网站代码的HTML,我们在制作网站的时候是需要用到一些常用的网页开发工具,才能完成我们网页的编写,那么,你知道制作网站常用的网页开发工具有哪些吗?不清楚的话,下面小编和你说一说吧!一…

Natural 自然语言处理(NLP)「全解析」

原文来源: 机器人圈概要:在自然语言处理方面的研究已经延续了五十多年,而随着计算机的兴起,它的发展也早已超出了语言学的范畴。提起AI,你可能会不假思索的想到自然语言处理、人脸识别、无人驾驶等。那么,你…

java web swing 教程_好程序员Java教程解读什么是swing

原标题:好程序员Java教程解读什么是swing好程序员Java教程解读什么是swing,swing是java GUI应用程序,也就是java做的桌面应用。运行swing程序要求用户电脑上有java环境,这一点不太现实也不方便。现在的java主要以web方向为主&…

大脑神经细胞也有老熟人

来源:科学网概要:观察者在没注意到熟悉的画面时,相应的神经元也会发射。但神经反应的强度和时间上与看到时的有明显差异。当人们看到认识的人图片时,比如著名的网球运动员Roger Federer或女演员Halle Berry,特定的细胞…

java把小写变大写_用java实现人民币小写变大写的方法

用java语言可以实现人民币小写转换为大写吗?如何实现呢?下面常见的用java实现人民币小写变大写的方法可以说是最精简的了,希望大家可以学习下。这里介绍一个通过取余的办法来实现将人民币小写转换为大写形式,个人认为比TTS上面的答…