mysql 唯一索引 死锁_MySQL死锁案例_唯一索引

近期在MySQL数据库中产生了死锁的情况,与通常的死锁不同,由于表中有唯一索引,所以加锁方式也比较有趣,本文将对于该例进行阐述(本文将对数据进行脱敏操作):

问题描述:隔离级别:READ-COMMITTED

表结构:

show create table  \G

CREATE TABLE `uniq` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`aa` int(11) DEFAULT NULL,

`bb` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `uniq_ab` (`aa`,`bb`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

注意其中存在唯一索引:UNIQUE KEY `uniq_ab` (`aa`,`bb`)

SQL执行顺序:

bbdf5d3884d6?from=singlemessage

SQL执行顺序

问题解析:

对于唯一索引,insert成功后,会加上X lock;

对于唯一索引的插入,需要在插入前进行duplicate key的检查,所以需要申请加上S lock,由于S lock与X lock不兼容,所以产生锁等待;

由于GAP与INSERT_INTENTION不兼容,所以产生锁等待,至此死锁产生。

基本概念

MySQL Innodb中的锁:

S LOCK:共享锁,也称读锁

X LOCK:排它锁,也称写锁

IS LOCK:暗示一个事务需要加共享锁

IX LOCK:暗示一个事务需要加排它锁

对应的兼容关系:

bbdf5d3884d6?from=singlemessage

锁兼容关系

此外,还有一套更为精准的判断逻辑,以符合更多场景,所以MySQL还具有以下几类的锁类型:Record lock(记录锁):加在索引行上的锁。

GAP lock(间隙锁):加在record两侧间隙上的锁,但是不包括数据本身。

Next-key lock:Record lock + GAP lock

INSERT_INTENTION lock(插入意向锁):在insert之前,需要申请INSERT_INTENTION lock

举例:

Session1:                                   mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;

mysql> INSERT INTO child (id) values (90),(102);                                           mysql> START TRANSACTION;                                           mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;                     Session2:

mysql> START TRANSACTION;                                                                mysql> INSERT INTO child (id) VALUES (101);

则Session2会产生INSERT_INTENTION lock waiting

Insert对于唯一索引的加锁方式:

对于insert的行,加上X lock,在Insert之前,需要加上 INSERT_INTENTION lock。

问题解决:

方案一(调整后端):

由于事发的逻辑为:一个事务中进行多次insert。在数据库层面的展示即为多次申请锁资源,并且是并发的事务,所以当插入的数据出现资源抢占时,容易发生死锁。

所以建议:insert时插入多个值,一次性申请该sql的所有锁资源。这样,则可以避免多次申请锁资源,同时在性能上也能得以提升。

方案二(调整前端逻辑):

规避重复触发的情况,防止不同事务在唯一索引上插入相同数据。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

聊聊mysql唯一索引的哪些坑,为什么还是产生重复数据?

前言 前段时间我踩过一个坑:在mysql8的一张innodb引擎的表中,加了唯一索引,但最后发现数据竟然还是重复了。 到底怎么回事呢? 本文通过一次踩坑经历,聊聊唯一索引,一些有意思的知识点。 1.还原问题现场 …

MySQL普通索引与唯一索引

MySQL普通索引与唯一索引 1. MySQL普通索引与唯一索引区别2. MySQL普通索引与唯一索引选择 1. MySQL普通索引与唯一索引区别 MySQL索引详解 MySQL索引分为很多种,常见的有主键索引与非主键索引,主键索引也就是我们常说的聚簇索引,主键索引叶…

MySQL | 普通索引和唯一索引,应该怎么选择?

在前面的基础篇文章中,我给你介绍过索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈,在不同的业务场景下,应该选择普通索引,还是唯一索引? 假设你在维护一个市民系统&…

【MySQL】轻松学习 唯一索引

目录 🍀🍀🍀🍀🍀 引言:什么是索引 一、唯一索引概述 二、创建唯一索引 1.创建表时创建唯一索引 唯一索引与unique约束共存时 2、已存在的表上创建索引 2.1、使用create语句 2.2、使用alter table语句 引…

mysql索引(七)唯一索引

Mysql索引大概有五种类型: 普通索引(INDEX):最基本的索引,没有任何限制 唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。 主键索引(PRIMARY)&…

MySQL数据库-表索引-唯一索引

所谓唯一索引,就是在创建索引时,限制索引的字段值必须是唯一的。通过该类型的索引可以比普通索引更快的查询某条记录。 创建表时定义索引 语法: CREATE TABLE tablename( propName1 type1, propName2 type2, ... UNIQUE INDEX|KEY [indexn…

word文档图标变成白色

word文档图标变成白色,有可能是电脑上既有microsoft office,又安装又WPS(WPS比较流氓,会篡改注册表中图标的路径,下图打个比方) 图标路径被修改后,容易与office发生冲突,就会出现两种…

Word图表自动编号

1.选择【引用】菜单,然后点击【插入题注】。 2.弹出 【题注对话框】,点击【新建标签】。 3.弹出【新建标签】对话框,输入需要的【标签】,点击确定。如图所示,比如第一章的图,就输入 【图 1-】。 4.回到“题…

Java操作Word图表

一、POM <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml…

WORD图标显示为白色解决办法

&#xff08;操作过程幸得朋友相助&#xff0c;但我还是决定用写博客的方式把操作成功的过程写下来&#xff0c;以免以后再出现相关问题可以翻看自己的博客知快速获取解决办法&#xff0c;也能帮助到一些遇到类似状况的朋友。鄙人电脑小白&#xff0c;初入江湖&#xff0c;涉世…

计算机图标显示的是word,word图标不显示怎么办 设置显示word图标的方法

word是我们常用的办公软件&#xff0c;有时在使用时&#xff0c;图标会莫名其妙不显示&#xff0c;那么word图标不显示怎么办&#xff1f;下面小编带来设置显示word图标的方法&#xff0c;希望对大家有所帮助。 设置显示word图标的方法&#xff1a; 按键盘上的 Windows 徽标健 …

计算机word图标不显示,word图标不显示怎么办 设置图标显示的具体方法

word是我们常用的办公软件&#xff0c;有时在使用时&#xff0c;图标会莫名其妙不显示&#xff0c;那么word图标不显示怎么办&#xff1f;下面小编带来设置显示word图标的方法&#xff0c;希望对大家有所帮助。 设置显示word图标的方法&#xff1a; 按键盘上的Windows徽标健R键…

Word生成图表(柱状图、线形图等,并附带表格展示数值)

说明 Java poi实现生成图表并附带表格数据展示一、效果图与模板 1、模板 2、效果图 二、Word生成图标与报表工具类 1.工具类 代码如下&#xff1a; package com.ml.module.file.util.wordchart;import com.google.common.base.Strings; import com.google.common.collec…

word中实现图表的自动编号功能

工作中&#xff0c;经常需要对图表进行编辑和编号&#xff0c;有的时候会涉及图表的顺序调整、增加或删除&#xff0c;刚刚调整好的图表的编号就会被打乱&#xff0c;有的时候还会漏调&#xff0c;从而导致即使耗费了大量的时间&#xff0c;图表的序号依然会出现问题&#xff0…

使用word代码域自动为图表 标号

当写一个比较几万字文档时&#xff0c;文章中可能会有很多 图表&#xff0c;而且下文引用上文的图表&#xff0c;手动敲的比较麻烦。 word的域是一个比较复杂的一个功能&#xff0c;今天通过word的代码域&#xff0c;提供两种方法来解决 自动为图生成图注&#xff0c;并引用&am…

Word图标显示异常空白解决方案

问题描述 最近使用电脑时突然发现桌面的word文档图标变成了空白&#xff0c;之前也遇到过这个问题&#xff0c;但一时想不起来之前是怎么解决的&#xff08;只记得是跟注册表相关&#xff09;&#xff0c;遂上网查找了一番&#xff0c;经过一两个小时折腾后终于解决了问题&…

用手机打开word图表位置很乱_9个工作中经常用到的Word技巧,能大大提升你的工作效率...

不管是职场小白还是职场大神&#xff0c;Word基本是我们都需要用到办公软件&#xff0c;所以今天跟大家分享9个超级实用的word技巧&#xff0c;学会了能让你的工作效率快到起飞&#xff0c;保姆级教程&#xff0c;一起来看看吧&#xff01; 1、不滚动鼠标快速翻到100页 文档第1…

电脑系统安装Word图标变成白色怎么恢复?

Win11 Word图标变成白色怎么恢复&#xff1f;有一些朋友发现自己电脑上的doc格式的word文档图标是白色的&#xff0c;这是怎么回事呢&#xff1f;出现这种情况应该如何解决&#xff1f;大家肯定要先确保电脑上有安装Office软件&#xff0c;今天给朋友们讲讲具体的解决方法&…

电脑桌面图标全部变成Word图标?

最近有用户发现自己的电脑桌面图标全部变成了Word文档图标&#xff0c;这是什么情况&#xff1f;到底是哪里出现了问题&#xff1f;针对这一问题&#xff0c;下面就由小编给大家分享桌面图标全部变成Word图标的解决办法。 操作步骤&#xff1a; 1、双击打开桌面的“计算机”。 …

POI Word 图表、柱状图、条形图、折线图、饼图

poi Excel 图表&#xff1a;https://blog.csdn.net/u014644574/article/details/105695787 1、pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependenc…