insert唯一索引加锁流程

news2025/2/25 1:02:28

MySQL版本:8.0.29
测试表:
在这里插入图片描述
测试数据:
在这里插入图片描述

开始测试:

事务1执行
在这里插入图片描述
加锁分析:

mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328945336:1068:140346432671984
ENGINE_TRANSACTION_ID: 4017
            THREAD_ID: 81
             EVENT_ID: 17
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140346432671984
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
1 row in set (0.00 sec)

事务1 insert操作相当于不加锁(会加page x latch)

事务2执行

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into staff(staff_no,name) values(7,'qgl');
阻塞在这里

加锁分析:

mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328944544:1068:140346432670032
ENGINE_TRANSACTION_ID: 4018
            THREAD_ID: 80
             EVENT_ID: 36
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140346432670032
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 2. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328944544:7:5:5:140346462116384
ENGINE_TRANSACTION_ID: 4018
            THREAD_ID: 80
             EVENT_ID: 36
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: idx_staff_no
OBJECT_INSTANCE_BEGIN: 140346462116384
            LOCK_TYPE: RECORD
            LOCK_MODE: S
          LOCK_STATUS: WAITING
            LOCK_DATA: 7, 6
*************************** 3. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328945336:1068:140346432671984
ENGINE_TRANSACTION_ID: 4017
            THREAD_ID: 81
             EVENT_ID: 17
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140346432671984
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 4. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328945336:7:5:5:140346462120992
ENGINE_TRANSACTION_ID: 4017
            THREAD_ID: 80
             EVENT_ID: 36
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: idx_staff_no
OBJECT_INSTANCE_BEGIN: 140346462120992
            LOCK_TYPE: RECORD
            LOCK_MODE: X,REC_NOT_GAP
          LOCK_STATUS: GRANTED
            LOCK_DATA: 7, 6
4 rows in set (0.00 sec)

事务1的id是4017,可以看到相比之前多了(76)行排他锁。
事务2的id是4018,加了(57]的next-key S锁。

事务1执行:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into staff(staff_no,name) values(7,'hcy');
Query OK, 1 row affected (0.00 sec)

加锁分析:

mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328945336:1068:140346432671984
ENGINE_TRANSACTION_ID: 4019
            THREAD_ID: 81
             EVENT_ID: 21
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140346432671984
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
1 row in set (0.01 sec)

事务1不加锁

事务2执行:

mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328944544:1068:140346432670032
ENGINE_TRANSACTION_ID: 4024
            THREAD_ID: 80
             EVENT_ID: 40
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140346432670032
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 2. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328944544:7:5:5:140346462116384
ENGINE_TRANSACTION_ID: 4024
            THREAD_ID: 80
             EVENT_ID: 40
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: idx_staff_no
OBJECT_INSTANCE_BEGIN: 140346462116384
            LOCK_TYPE: RECORD
            LOCK_MODE: X
          LOCK_STATUS: WAITING
            LOCK_DATA: 7, 8
*************************** 3. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328945336:1068:140346432671984
ENGINE_TRANSACTION_ID: 4019
            THREAD_ID: 81
             EVENT_ID: 21
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140346432671984
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 4. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 140346328945336:7:5:5:140346462120992
ENGINE_TRANSACTION_ID: 4019
            THREAD_ID: 80
             EVENT_ID: 40
        OBJECT_SCHEMA: db_study
          OBJECT_NAME: staff
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: idx_staff_no
OBJECT_INSTANCE_BEGIN: 140346462120992
            LOCK_TYPE: RECORD
            LOCK_MODE: X,REC_NOT_GAP
          LOCK_STATUS: GRANTED
            LOCK_DATA: 7, 8
4 rows in set (0.00 sec)

事务1的id是4019,同样也是加了行排他锁(78)
事务2的id是4024,相比普通的insert操作,这次加的是(57]next-key X锁

疑问:
MySQL,insert时唯一索引冲突,为什么会加next-key锁?

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

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

相关文章

Express 中使用JWT进行登录验证

cookie 篇 : Node.js 中 cookie的验证登录 | session 篇 : Node.js 中 session验证登录 在前面讲过了两种验证登录的方式,其一是cookie,其二是session;那么在讲JWT之前先来简单的回顾这两种方式区别;cookie和sessi…

Java笔记023-包装类、String类、字符串的特性、String类、StringBuffer类、StringBuilder类

常用类包装类包装类的分类1、针对八种基本定义相应的引用类型-包装类2、有了类的特点,就可以调用类中的方法基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble包装类和基本数据的转换演示包装类和基本数据…

LInux目录结构

文章目录Linux的目录结构Linux的目录结构Linux路径的描述方式目录各功能介绍HOME目录和工作目录Linux的目录结构 Linux的目录结构 Linux的目录结构是一个树型结构。 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在…

【UE4 第一人称射击游戏】37-拾取副武器“M4A1”

上一篇:【UE4 第一人称射击游戏】36-切换武器时改变UI本篇效果:在拾取副武器“M4A1”前,点击键盘2键是无法切换武器的,当拾取武器后,点击键盘2键可以切换武器(目前仅是右下角的图标和文字实现了切换&#x…

VBA小模板,一个不放回的抽奖用的例子

1 问题 一个不放回的抽奖用VBA怎么写,下面用一个类似对对碰/ 翻牌子的游戏(抽到的奖励不放回,可抽的东西越来越少)来举例说明 1.1 首先要回顾下几个经典的随机模型 古典概型,重点就是每次抽奖的各个奖品,概…

宇视门禁一体机接线图

宇视门禁一体机接线图宇视门禁一体机带反馈信号电磁锁接线图门禁的GND线通用,可以连到同一根线上,也可以分开连简单整理如图一体机线颜色和功能对应表颜色线路绿色RS485_A粉色RS485_B黑色GND蓝色WIEGAND_OUT_D0白色WIEGAND_OUT_D1灰色WIEGAND_IN_D0棕色W…

测试面试真题|工作2年,从小厂到大厂,薪资翻倍是怎样的体验?

最近,霍格沃兹测试学院学员 C 同学成功拿下某互联网大厂年薪 30W 测试开发岗位 Offer,顺利完成从手工测试工程师到测试开发的逆袭,薪资翻倍(涨幅 100%),并获得了学院颁发的优秀学员奖学金。C 同学工作刚满 …

【3D目标检测】Delving into Localization Errors for Monocular 3D Object Detection

目录概述细节错误分析概述 本文是基于单目图像的3D目标检测方法。 【2021】【MonoDLE】 研究的问题: 核心问题:如何提高基于单目图像的3D目标检测的效果。作者量化了每个子任务的整体影响,观察到以下现象 观察一:定位误差是制约目标检测性…

变异凯撒题解

题目变异凯撒,说明没有使用一般的凯撒加密看到一个密码,我们可以找一下规律首先密文不完全是字母,但是经典凯撒加密的密文一定都是字母,说明这个题目可能是ASCLL码表偏移,而不是字母表偏移经典凯撒加密是字母和字母的偏…

SSM纯注解后台代码整合(Spring+SpringMvc+Mybatis)

SSM后台整合(SpringSpringMvcMybtis事务Rest风格统一结果封装统一异常处理拦截器) 文章目录1 基础环境搭建1.1 建表1.2 创建web项目1.3 导入依赖坐标(pom.xml)1.4 包路径的创建1.5 在pojo包下编写book实体类1.6 在webapp包下导入静…

很多人还不知道中视频计划手机上发布多端横竖屏视频的方法

如果说你刚开始接触中视频,你必须要学会的小知识。 横屏视频是16;9的视频,一般是手机横向拍摄的视频。 上传这样的视频有两种方法。第一种是需要用到电脑,第二种就是我今天要分享的这种,没有电脑,我们用手…

测试新人入职第一天都做什么?

测试入职第一天都做什么? 大家都知道,入职一家新公司就是一个新的起点,新的开始。不管在之前公司干了多久,还是第一次踏入社会进入企业上班,都需要遵守新公司的规则以及规章制度。不管企业的规章制度是什么&#xff0…

前端提交信息规范 commit规范 commitlint husky commitizen

前端提交规范 约定式提交约定式提交安装commitizen 及其适配器husky commitlint 提交校验至此恭喜你已经配置好提交校验了,快去试试吧技术同学开发中有没有出现 : 因某种原因当需要回滚,这时候一看之前提交的massage真的乌烟瘴气 无法分辨回…

使用ResNet50实现CIFAR100数据集的训练

如果对你有用的话,希望能够点赞支持一下,这样我就能有更多的动力更新更多的学习笔记了。😄😄 使用ResNet进行CIFAR-10数据集进行测试,这里使用的是将CIFAR-10数据集的分辨率扩大到32X32,因为算力相关的…

蓝桥杯2019年第十届省赛C++B组

文章目录A:组队(5分 √)B:年号字串(5分 √)C: 数列求值(10分 √)D: 数的分解(10分 )F: 特别数的和(15分 √)A:组队&#x…

【蓝桥杯简单篇】Python组刷题日寄Part05

刷题日记?刷题日寄! 萌新备战蓝桥杯python组 🌹 发现有需要纠正的地方,烦请指正! 🚀 欢迎小伙伴们的三连关注! 往期系列: 【蓝桥杯简单篇】Python组刷题日寄Part01 【蓝桥杯简单篇】…

Oracle Mysql审计日志等保测评

mysql oracle的审计日志 mysql的审计日志说是有两种方法,一种是需要安装插件模式的审计,一种直接开一个参数 1.安装插件模式 一、 mysql 日志 配置永久配置 : 保存时间及大小 https://blog.csdn.net/m0_51197424/article/details/12432840…

设计模式(二)----软件设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,要尽量根据7条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 1、单一职责原则 ( 核心:尽量保证类&#xff0…

毫米波雷达和视觉融合的学习路线

了解各个传感器的成像原理,知其所以然,同时了解每种传感器的对比及优缺点,为什么要用这几种融合,可以通过去看一些德州仪器的雷达原理视频(b站),雷达工作手册等。先广而后深:了解经典…

C#-WPF介绍-创建项目-添加按钮等及其事件处理、属性设置

微软官网指导链接:适用于 .NET 5 的 Windows Presentation Foundation 文档 | Microsoft Learn WPF框架介绍:Windows Presentation Foundation 简介 - WPF .NET | Microsoft Learn WPF介绍 WPF(Windows Presentation Foundation&#xff09…