锁--07_1----插入意向锁-Insert加锁过程

news2024/11/17 13:44:38

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 插入意向锁
  • MySQL执行插入Insert时的加锁过程
    • MySQL官方文档
    • MySQL insert加锁流程
        • 1.加插入意向锁
        • 2.判断插入记录是否有唯一键
        • 3. 插入记录并对记录加X锁
        • ==插入意向锁----> S锁----> X锁---->执行插入==
    • 案例
    • 在这里插入图片描述 insert加锁的小结
    • 建议:


插入意向锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MySQL执行插入Insert时的加锁过程

MySQL官方文档

MySQL官方文档对Insert加锁情况的描述

在这里插入图片描述
解读:

  1. INSERT操作会对新插入的记录加行锁写锁(排它锁X锁);注意:区别于执行update,执行insert时这里加的是X锁,并非next-key lock,因此不会阻塞其他的事务对gap区间的插入操作;

  2. 在插入记录前,会向插入记录所在位置申请意向插入意向锁(Insertion Intention Gap Lock);只要不是插入的是同一行记录,多个事务对相同gap区间的插入意向锁操作不会冲突

  3. 对于唯一索引,发生唯一键冲突时,当前事务会先尝试在这条记录上加读锁S锁;加S锁的机制可能会导致死锁:即A线程占用记录的X锁,B、C阻塞,它们需要先获取S锁再获取X锁执行更新;当A释放X锁时,B、C同时拿到S锁(共享锁),但互相都无法继续获取X锁(S锁与X锁互斥),导致死锁;

MySQL insert加锁流程

1.加插入意向锁
  1. 首先对插入的间隙加插入意向锁(Insert Intension Locks);注意插入意向锁可以理解为只是个插入动作,并非真的加锁
  2. 如果该间隙已被加上了GAP锁(间隙锁)或 Next-Key 锁(含GAP 锁),则加锁失败,等待间隙释放;
  3. 如果没有,则加插入意向锁成功,表示可以插入;只要不是插入的是同一行记录,多个事务对相同gap区间加插入意向锁不会冲突;
2.判断插入记录是否有唯一键

[可选 唯一键]然后判断插入记录是否有唯一键,如果有,则需要进行唯一性约束检查:

  • 如果不存在相同键值,则准备插入;
  • 如果存在相同键值,则判断该键值是否加锁;

如果没有锁, 判断该记录是否被标记为删除;

  • 如果标记为删除,说明删除事务已经提交,数据页上的记录还没来得及 purge,这时尝试加S锁;
  • 如果没有标记删除,说明数据已存在,本次插入会导致唯一键冲突,则报 1062 duplicate key 错误

如果有锁,说明该记录正在被处理(正在被其他事务新增、删除或更新),且其他事务还未提交,则当前事务尝试加S锁后会进入阻塞,等待其他事务释放记录X锁;

3. 插入记录并对记录加X锁

插入记录并对记录加X锁,当前事务提交或回滚时释放X锁;

插入意向锁----> S锁----> X锁---->执行插入

案例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述 insert加锁的小结

  • 关于隐式锁,一般使用自增主键且不含唯一键的insert语句,并发时不会有冲突,因为插入意向锁是隐式锁,实际代表的是一个准备插入的行为;这个行为只和间隙锁GAP锁冲突;
  • 关于锁升级,当插入的数据含唯一键,出现并发插入时(如事务A和事务B,事务A先执行insert但还未提交事务),后执行插入的事务B会使用当前读,如果发现这条记录已存在(还未提交),则会先尝试获取S锁;此时事务A的插入意向锁(隐式锁)会被提升为显式锁( X 锁),导致事务B阻塞;
  • 关于插入死锁;正是MySQL这种唯一键冲突时的insert插入获取锁的规则,导致了在[case2:并发插入事务中的顺序顺序不一致]、[case3: 删除提交但还未purge]、或[case4: 并发插入事务中单条回滚]的case下,会出现并行的事务先拿到S锁(共享锁),但在执行insert加X锁时,发现阻塞,构成死锁;这个问题在MySQL官方文档也提到了;

建议:

  1. 针对case2,保证各个事务线程执行插入时,插入数据的顺序相同,避免死锁;尽量保证数据有序插入
  2. 针对case3和case4,保证各个事务线程执行含唯一键的数据插入前,先对数据加X锁,即跳过insert加锁机制的先尝试获取S锁这一阶段;如select … for update;如果查到了,则跳过插入;

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

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

相关文章

使用opencv的Sobel算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题,也是经典的技术难题之一。如何快速、精确地提取图像边缘信息,一直是国内外的研究热点,同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

瑞芯微rv1126边缘计算盒子高性价比2.0TOPS INT8/INT16

边缘计算盒子 瑞芯微rv1126 | 2.0TOPS INT8/INT16 ● 集成了NPU,算力高达2.0TOPsINT8/INT16。 ● 支持H.264/H.265/MJPEG视频编解码;支持多级别视频质量配置及编码复杂度设置。 ● 编解码性能 3840 x 216030 fps 1080p30 fps encoding 3840 x 21603…

力扣题目学习笔记(OC + Swift) 12. 整数转罗马数字

12. 整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XI…

eclipse连接mysql数据库(下载eclipse,下载安装mysql,下载mysql驱动)

前言: 使用版本:eclipse2017,mysql5.7.0,MySQL的jar建议使用最新的,可以避免警告! 1:下载安装:eclipse,mysql在我之前博客中有 http://t.csdnimg.cn/UW5fshttp://t.csdn…

使用 Matplotlib 和 mplcursors 创建交互式数据可视化,鼠标悬停动态显示数据

在本博客中,我们将探讨如何使用 Matplotlib(Python 中流行的绘图库)和 mplcursors(一个为 Matplotlib 图表添加交互式数据光标的库)创建交互式数据可视化。 效果图: 环境设置 首先,请确保已…

stable-diffusion-webui(AI绘画)项目实现,即遇到的问题

实现步骤: 为了使环境中的库版本不会乱,导致自己电脑原来一些项目无法运行最好使用虚拟环境 下载miniconda 在搜索中搜所miniconda找到 建立虚拟环境 conda create --name sdwebui python3.10.6 每次运行激活这个虚拟环境 conda activate sdwebui …

算法通关村第十二关—字符串转换(青铜)

一、转换成小写字母 LeetCode709.给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 示例1: 输入:s"Hello" 输出:"hello" 示例2: 输入:s&qu…

万户 OA OfficeServer.jsp 任意文件上传漏洞复现

0x01 产品简介 万户OA是面向政府组织及企事业单位的FlexOffice自主安全协同办公平台。 0x02 漏洞概述 万户OA OfficeServer.jsp接口存在任意文件上传漏洞,攻击者可通过该漏洞上传任意文件从而控制整个服务器。 0x03 复现环境 FOFA: (banner="OASESSIONID" &a…

Vmware Windows10安装Apache php

文章目录 一、下载必要的软件二、安装Apache三、安装php四、php连接Apache五、测试 一、下载必要的软件 Apache:https://www.apachelounge.com/download/ PHP:http://windows.php.net/download/ 二、安装Apache 将下载的压缩包解压,移动里…

0基础学习VR全景平台篇第128篇:720VR全景拍摄设备推荐

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 本篇教程,小编为大家推荐720VR全景拍摄所需要的设备器材。上节我们提到,理论上任意相机和镜头都能够拍摄全景,但为了标准化制作流程&#xff0…

Golang在 Docker 中交叉编译 Windows

前言: 前端时间把本地的 Golang 开发环境卸载了,如果编写代码的话就是启动一个 Golang 的 Docker 容器。这样做对于服务端开发本来也是没有问题的,但是有时候想要把程序放到 Windows 上面来执行,那就遇到麻烦了。因为 Docker 容器…

VSCode解决本地浏览器需要跨域问题

这里写目录标题 测试用代码执行代码后控制台报错现象解决方案 测试用代码 先把测试用的代码贴出来 测试代码结构 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

git checkout进行更改分支

git clone https://gitee.com/yaleguo1/minit-learning-demo.git下载代码。 cd minit-learning-demo/进入目录里边。 ls -l看一下当前分支的内容。 git checkout geek_chapter02更改分支到geek_chapter02。 ls -l看一下目录里边的内容。

【Axure RP9】的详细安装及Axure入门应用

目录 一 Axure入门安装 1.1 Axure是什么? 1.2 Axure应用场景 1.3 Axure安装 1.3.1 汉化 1.3.2 授权 二, Axure应用 1.1 Axure软件界面概述 1.2 Axure的应用 1.2.1备份 1.2.2 视图显示及网格设置 1.2.3 生成HTML文件 1.2.4 备注说明 一 Axure入门安装 1.1 Axure…

如何发布自定义 npm 组件包

准备工作 1. 注册 npm 账号 还没有 npm 账号&#xff1f;去官网注册&#xff1a; https://www.npmjs.com 需要记住用户名、密码、邮箱&#xff0c;后面需要用到。 2. 查看本地 npm 镜像&#xff0c;如果不是默认的&#xff0c;需要改回来 npm config get registry重置镜像路…

安装统信UOS服务器操作系统1060

原文链接&#xff1a;安装统信UOS服务器操作系统1060 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是如何安装统信UOS服务器操作系统1060。统信UOS是一款基于Linux内核&#xff0c;专为中国市场定制开发的操作系统。它不仅提供了良好的用户体验&#xff0c;还在…

翻译: 为什么需要微调大模型 Why Fine-tuning LLM

虽然RAG提供了一种方式来给大型语言模型提供额外的信息&#xff0c;但还有另一种叫做微调&#xff08;fine-tuning&#xff09;的技术&#xff0c;也是给它更多信息的一种方式。特别是&#xff0c;如果你有的上下文比大型语言模型的输入长度或上下文窗口长度更大&#xff0c;那…

单片机Freertos入门(二)任务的创建、删除

1、串口配置 首先将串口进行配置&#xff0c;后续经常会应用&#xff0c;具体步骤点击&#xff1a;串口配置。 2、任务 创建一个任务&#xff0c;就是开辟一个空间、每个任务中都会有while&#xff08;1&#xff09;死循环。 2.1相关函数 动态创建&#xff1a;xTaskCreate…

Linux第一个小程序——进度条

Linux第一个小程序——进度条 1. 前言2. 缓冲区概念3. \r && \n4. 进度条实现4.1 初级进度条4.2 升级进度条 1. 前言 在我们写这个小程序之前&#xff0c;我们要用到我们学的三个知识点 gcc的使用vim的使用make/makefile的使用 除此之外还需要一些其他的知识点&…

如何在jenkins容器中安装python+httprunner+pytest+git+allure(一)

背景&#xff1a; API接口自动化使用python语言实现&#xff0c;利用httprunner框架编写自动化用例场景&#xff08;执行的时候还是依赖pytest),使用jenkins自动构建git上的源代码&#xff0c;并产生allure报告可视化展示API执行结果。 步骤 1.进入jenkins容器 注意使用roo…