mysql 唯一索引 死锁_MySQL 死锁套路:唯一索引 S 锁与 X 锁的爱恨情仇

毫不夸张的说,有一半以上的死锁问题由唯一索引贡献,后面介绍的很多死锁的问题都跟唯一索引有关。这次我们讲一段唯一索引 S 锁与 X 锁的爱恨情仇

我们来看一个简化过的例子

# 构造数据

CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(10),

`level` int(11),

PRIMARY KEY (`id`),

UNIQUE KEY `uk_name` (`name`)

);

INSERT INTO `t1` (`name`, `level`) VALUES ('A',0);

# 出现问题的sql语句如下,并发情况下就会出现死锁

INSERT ignore INTO `t1` (`name`, `level`) VALUES ('A',0);

update t1 set level = 1 where name = "A";

我们用之前介绍过的源码分析方式,先来看下这两条语句分别加什么锁,然后分析死锁形成的过程。

第一条语句

INSERT ignore INTO t1 (name, level) VALUES ('A',0);

在调试中得到的结果如下

3f1aaf5c8b95260f4851691940b1f6fd.png

可以看到这条语句对唯一键 uk_name 加共享锁(S锁),而且成功。

第二条语句

update t1 set level = 1 where name = "A"; 通过唯一键更新数据库字段。

这种情况在之前的文章已经介绍过,会对唯一索引加 X 锁,然后对主键索引加 X 锁

a580706c001c6f93b51bd2dbf09ff899.png

82d02d830cdb41075d877fca877c30cf.png

这样就可以非常轻松的复现死锁的问题了,步骤如下

开启两个 session,分别 begin

session1 执行INSERT ignore INTO t1 (name, level) VALUES ('A',0);

session2 执行INSERT ignore INTO t1 (name, level) VALUES ('A',0);

session1 执行update t1 set level = 1 where name = "A"; 进入等待状态

session2 执行update t1 set level = 1 where name = "A";,死锁产生,被回滚,同时事务 1 执行成功

详细的锁状态变化如下

t1

t2

备注

INSERT IGNORE INTO

-

t1成功获得uk的S锁 DB_SUCCESS

-

INSERT IGNORE INTO

t2成功获得uk的S锁 DB_SUCCESS

UPDATE

-

t1尝试获得uk的X锁,但没有成功,处于等待状态 DB_LOCK_WAIT

-

UPDATE

t2尝试获得uk的X锁,发现死锁产生 DB_DEADLOCK

-

Deadlock

t2释放S锁

成功

-

-

死锁日志如下:

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

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

相关文章

ejb 示例 2018_EJB钝化和激活示例

ejb 示例 2018在本教程中,我们将了解状态Java企业会话Bean中激活和钝化的工作方式。 1.简介 有状态会话Bean通常保存有关特定客户端的信息,并在整个会话中保存该信息。 但是,事实是,客户端会话往往会在相当长的时间内保持活动状态…

js微信小程序页面左上角返回跳转指定页面

微信小程序非导航栏tabBar页面左上角返回默认返回上一次的页面(即进入当前页面的前一页面),如果需要自定义页面,可以通过js中onUnload函数进行指定页面跳转。 ①关闭所有页,打开url指定页面 onUnload: function () {…

服务器mysql显示链接次数太多,服务器mysql显示链接次数太多

服务器mysql显示链接次数太多 内容精选换一换在本章节中,您将会把游戏应用部署到CCE云容器引擎中,您需要执行以下操作:创建集群:集群是运行应用的逻辑分组,包含一组云服务器资源,每个节点对应一台云服务器。…

使用JUnit 5在Mockito中方便地进行模拟–官方方式

从版本2.17.0开始,如果使用JUnit 5, Mockito提供了官方(内置)支持来管理模拟生命周期。 入门 为了利用该集成,需要在JUnit 5的junit-platform-engine旁边添加Mockito的mockito-junit-jupiter依赖项(有关详…

esp32搭建文件服务器,ESP32入门示例 - SD卡Web服务器

这个是来自ESP32官方示例的改版,官方的示例由于存在一些问题所以我进行了修改原本的示例有点逻辑上的问题,所以进行了一些修改主要修改有:1.新增SD卡测试部分 复制自官方SD卡示例2.新增一个根目录页,访问根目录就可以看到3.修改了…

mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置

一、 MySQLMyCat分库分表1 MyCat简介java编写的数据库中间件Mycat运行环境需要JDK。Mycat是中间件,运行在代码应用和MySQL数据库之间的应用。前身: corba,是阿里开发的数据库中间件,实现MySQL数据库分库分表集群管理的中间件&…

字符串String截取字符char

字符串类的charAt() 方法可返回指定位置的字符。 stringObject.charAt(index)从键盘输入获取了一个字符串,将其数据类型转换为字符型。 Scanner scan new Scanner(System.in); String str scan.next(); char ca str.charAt(0);示例: import java.u…

Java基本语法(14)--for循环结构

循环结构:在某些条件满足的情况下,反复执行特定代码的功能。 基本格式: for (①初始化部分; ②循环条件部分; ④迭代部分){ ③循环体部分; }如果①,④部分多条语句,语句之间用“,”…

Java 8中的功能接口是什么? @功能注释和示例

函数接口是Java 8最重要的概念之一,实际上为lambda表达式提供了动力,但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它,并花时间学习lambda表达式和Stream API。除非您知道什么是功能接口以及lambda与它之间的关…

win10存储池_3个光威480G SSD组WIN10存储池,深度测试到底值不值得搞

上次由于我SSD不够,所以我用虚拟硬盘的方式,虚拟了3个VHDX硬盘,组了个奇偶校验的存储池,并且简单的做了测试。测试结果是,组存储池确实提高了我们的数据安全性。WIN10存储池,可以让我们玩家省去组RAID&…

截止角频率和截止频率的关系_开关电源的控制环截止频率和开关频率有什么关系?...

【新朋友】点击上方蓝字“电源之家”关注【老朋友】点击右上角按钮,分享到朋友圈电源之家官方技术③群:522815202(3000人群)(电源行业第一大技术交流QQ群)这个问题很专业,因此答案注定也专业而非科普,非电力电子专业小伙伴看不懂很…

restlet_Restlet框架– Hello World示例

restletRestlet是用于Java平台的轻量级,全面的开源REST框架。 Restlet适用于服务器和客户端Web应用程序。 它支持主要的Internet传输,数据格式和服务描述标准,例如HTTP和HTTPS,SMTP,XML,JSON,At…

在运行时在Spring Cloud Config中刷新属性配置

在本系列Spring Cloud Config的教程系列中,我们将讨论在运行时刷新属性配置的过程,我们将使用Spring Boot致动器/refresh端点进行/refresh 。 此外,我们还将研究使用RefreshScope注释刷新Value属性。 在我的Spring Cloud Config的上一教程中…

pythonnumpy教程_Python学习教程:通俗易懂的Numpy入门教程

Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pandas也是基于numpy构建的,机器学习包scikit-learn也大量使用了numpy方法。本文介绍了Numpy的n维数组在数据处理和分析的所有核心应用。目录如何构建numpy数组如何观察数…

css hack技巧_5种减少Hack的编码技巧

css hack技巧在本文中,我们将探讨五种方法,这些方法可以使用有效的编码来帮助垃圾回收器花费更少的CPU时间分配和释放内存,并减少GC开销。 较长的GC通常会导致我们的代码在回收内存时停止(也称为“停止世界”)。 一些…

mysql数据库全备_MySQL innobackupex全备是指什么

MySQL innobackupex全备是指什么发布时间:2020-06-03 10:10:31来源:51CTO阅读:133作者:三月下文主要给大家带来MySQL innobackupex全备是指什么,希望这些内容能够带给大家实际用处,这也是我编辑MySQL innob…

数组初始化使用(写)new与不使用(不写)new

首先,数组初始化时,写不写new没有区别的。int arr[] new int[]{ 3, 9, 8};或者int[] arr {3,9,8};编译器遇到 int a[] {3, 8, 9}; 会编译成和 int a[] new int[] {3, 8, 9}; 完全一样的中间代码。 ①不同于String类。String由于实现了常量池&#xf…

Java数组(2)--一维数组

一、一维数组的(声明赋值)初始化 声明:type var[]; 或 type[] var;(示例:int[] age;) 初始化: ①动态初始化:声明且为数组元素分配空间,与赋值的操作分开进行 int[] ar…

Java数组(3)--二维(多维)数组

二维数组相当于一维数组的元素是一维数组 一、二维数组声明赋值初始化 动态初始化① int[][] arr new int[3][2];定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为…

workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...

文件名称: workflow下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 134 KB上传时间: 2014-09-18下载次数: 3提 供 者: 张华详细说明:java实现的activity工作流实例 -java activity文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉)…