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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

大脑神经细胞也有老熟人

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

从生成对抗网络到更自动化的人工智能

来源:中国计算机协会作者:黄鹤 王长虎概要:“What I cannot create, I do not understand.” 这是著名物理学家费曼的一句名言。把这句话放在人工智能领域,可以理解为:要想让机器真正理解某样东西,就得让…

百度人工智能

来源:199IT互联网数据中心概要:人工智能的发展运用到生活的各个方面。

java9 揭秘 jlink_初试Java9

原标题:初试Java9Java 9 正式发布了JDK 9(http://openjdk.java.net/projects/jdk9/)有不少重要或是有意思的新特性,这里简单介绍下我的了解与尝试抛砖引玉下载oracle 官网下载即可。(http://www.oracle.com/technetwork/java/javase/downloads/jdk9-down…

前沿报告|AI系列报告之:智能计算芯片

来源:中国电子技术化标准研究院 概要:人工智能时代的到来,智能计算芯片需求旺盛颇具投资价值

java编译命令带参数_java编译命令基础知识点

我们在对计算机下达指令时,人类的语言它是不能够明白,需要通过编译的时候翻译成计算机能听懂的语言。编译过程中会调用javac命令,这点大家可能接触的不多,毕竟是是计算机程序内部运行时的操作。下面我们就编译的概念、命令带来讲解…

一文读懂工业物联网 全面起底核心玩家和技术体系

来源:智东西概要:未来10年内,全球物联网将创造10多万亿美元的价值,约占全球经济的1/10,并与城市管理、生产制造、汽车驾驶、能源环保等形成数个千亿级规模以上的细分市场。物联网进入与传统产业深度融合发展的崭新阶段…

java 枚举可以循环吗_(转载)java 枚举 循环遍历以及一些简单常见的使用

本文转载自:http://blog.csdn.net/qq_27093465/article/details/51706076 作者:李学凯什么时候想用枚举类型:有时候,在设计一个java model对象的时候,你需要一些具体的常量字符串之类的东西,这个东西又没必…