当前位置: 首页 > news >正文

MySQL-锁

MySQL的锁机制

在这里插入图片描述

1.共享锁(Shared Lock)和排他锁(Exclusive Lock)

事务不能同时具有行共享锁和排他锁,如果事务想要获取排他锁,前提是行没有共享锁和排他锁。而共享锁,只要行没有排他锁都能获取到。

手动开启共享锁/排他锁:

-- 对需要查询的行添加共享锁
select .... from .... lock in share mode;
-- 对读取记录加排他锁
select .... from .... for update;

注意:当一个事务尝试获取一个已经被其他事务持有的排他锁时,它会进入等待状态,直到该锁被释放为止。在MySQL 8.0版本中,新增了NOWAIT和SKIP LOCKED两种语法,可以用来控制事务在获取不到锁时的行为。

delete操作过程:

  1. 事务开始,获取待删除数据的排他锁。
  2. 获取成功,执行删除操作。
  3. 事务提交
  4. 释放锁。

update操作过程:分为两种情况,有更改主键值和未修改主键值。

未修改主键值:

  1. 更新前后存储空间未发生变化:获取排他锁,在原记录进行修改。
  2. 更新前后存储空间发生变化:获取排他锁,将该记录删除,最后在插入一条新的记录。

修改主键值:在原记录进行一次delete操作,再来一次insert操作。

insert操作过程:一般情况下,insert操作并不加锁,通过一种隐式锁保护新插入的记录不被未提交的事务所看到。

注意:共享锁->排他锁(阻塞)+共享锁(阻塞)

2.表锁

2.1X锁和S锁

表锁:锁定整张表,不依赖于存储引擎,表锁的开销较小,但是锁粒度大,并发执行效率低。

特殊场景:在修改表结构的过程中像alter table 、drop table这样的语句,就会有表锁的存在,同时也会阻塞其他对表的操作语句(update、select…)。

表级别的X锁和S锁:

-- 添加S锁(InnoDB引擎会对表table添加S锁)
LOCK TABLES table READ;
-- 添加X锁(InnoDB引擎会对表table添加X锁)
LOCK TABLES table WRITE;
-- 解锁
UNLOCK TABLES;

2.2意向锁(intention lock)

InnoDB支持多粒度锁,允许行级锁和表级锁共存。

  1. 为了协调行锁和表的关系,支持多粒度锁共存。

存在的问题:如果数据量非常大,表如果要知道哪一行存在锁,就非常的麻烦,因此就有了意向锁。

如果我们给某一行的数据添加了锁,数据库会自动给更大的一级空间,比如数据页或表添加上意向锁,表示该数据页或数据表已经存在锁了。

-- 事务要获取某个行的S锁,必须先获得IS锁。
SELECT ... FROM table ... LOCK IN SHARE MODE;
-- 添加排他锁,会自动获取IS锁。
SELECT... FROM table ... for UPDATE;

意向锁和意向锁的兼容性:

意向共享锁意向排他锁
意向共享锁兼容兼容
意向排他锁兼容兼容

意向锁和表锁的兼容性:

意向共享锁意向排他锁
共享锁兼容不兼容
排他锁不兼容不兼容

2.3自增锁

表中字段存在AUTO_INCREMENT属性。当新增数据自动生成主键时,就会使用该锁来生成,保证生成的主键是自增且唯一的。

AUTOINC 锁具有如下特点:

  1. AUTO_INC 锁互不兼容,也就是说同一张表同时只允许有一个自增锁;
  2. 自增值一旦分配了就会 +1,如果事务回滚,自增值也不会减回去,所以自增值可能会出现中断的情况。

2.4元数据锁

主要为了解决表结构的修改和表数据修改冲突问题。

当对一个表增删改查操作的时候,加MDL读锁;当要对表结构变更操作的时候,加MDL写锁。

3.乐观锁和悲观锁

3.1乐观锁

实现乐观锁可以采用CAS(Compare And Swap)的方式,乐观的认为产生锁冲突的概率较小。适用于锁冲突概率比较小的场景。

在这里插入图片描述

ABA问题:假设最开始的数据是A,在线程1执行的过程中,有其他线程将数据修改成了B,又再次被修改为A,就会导致线程1错误的认为该数据没有被修改过,因此可以通过对数据添加一个版本号,对于每次修改,都会产生一个新的修改数据版本,通过比较数据版本判断数据是否被更改。

时间戳机制:通过比较时间戳判断数据是否被修改。

3.2悲观锁

悲观锁:依靠数据库提供的锁机制来实现。

SELECT … FOR UPDATE是MySQL中的悲观锁,执行过程会将所有扫描的行都锁上,因此在MySQL中用悲观锁必须使用索引,而不是全表扫描,否则会将整张表锁住。

4.行锁

4.1记录锁

SELECT ... FROM ... WHERE id = 1 FOR UPDATE;

记录锁:记录锁(Record Lock)是一种锁定索引记录的锁定方式。当一个事务需要访问某个索引记录时,它可以在该记录上加一个记录锁,以防止其他事务修改或删除该记录。记录锁是针对单个记录的,它只锁定该记录本身,不会影响其他记录。

4.2间隙锁

间隙锁在REPEATABLE READ隔离级别下是可以解决幻读问题的。给不存在的索引添加锁,那么添加的就是间隙锁。

例如有id ={1,3,5,8,10,15},锁定13,那么在区间(10,15)之间都不能插入新的数据。

SELECT ... FROM ... WHERE id = 13 FOR UPDATE;

注意:间隙锁的唯一目的就是阻止其他事务在间隙上插入记录,一个事务在一个间隙上加锁并不会阻止其他事务在相同间隙上加锁,无论是共享锁还是排它锁,他们互不冲突,执行相同的功能。

4.3临键锁

临键锁:临键锁(Next-Key Lock)是结合记录锁和间隙锁的一种锁定方式。它不仅锁定索引上的记录,还锁定该记录前面的间隙。

例如有:id={1,3,5,8,10,15},记录15被锁定了,且(10,+∞)不能添加记录。

SELECT ... FROM ... WHERE id<=15 AND id>10 for update;

4.4插入意向锁

插入意向锁(Insert Intention Lock)是MySQL中的一种间隙锁形式的意向锁,用于在INSERT操作之前设置。

在真正执行INSERT操作之前,每个事务会在要插入的行的前一条记录上加一个插入意向锁。这样,其他事务在尝试插入相同间隙时,会检查该间隙上是否已经存在插入意向锁。如果存在插入意向锁,那么其他事务就可以知道已经有其他事务打算在这个间隙中插入数据,就会进行等待而不是冲突。

由于插入意向锁之间不会相互冲突,多个事务可以同时持有相同间隙上的插入意向锁。这就避免了事务之间的互相冲突,提高了并发插入的性能。

需要注意的是,插入意向锁之间并不会相互冲突,多个事务可以同时持有相同间隙上的插入意向锁。

5.全局锁

锁整个数据库实例。

全局锁命令:

FLUSH TABLES WITH READ LOCK;

有相同间隙上的插入意向锁。这就避免了事务之间的互相冲突,提高了并发插入的性能。

需要注意的是,插入意向锁之间并不会相互冲突,多个事务可以同时持有相同间隙上的插入意向锁。

5.全局锁

锁整个数据库实例。

全局锁命令:

FLUSH TABLES WITH READ LOCK;

相关文章:

MySQL-锁

MySQL的锁机制 1.共享锁(Shared Lock)和排他锁(Exclusive Lock) 事务不能同时具有行共享锁和排他锁&#xff0c;如果事务想要获取排他锁&#xff0c;前提是行没有共享锁和排他锁。而共享锁&#xff0c;只要行没有排他锁都能获取到。 手动开启共享锁/排他锁&#xff1a; -- 对…...

ES6中变量解构赋值

数组的解构赋值 ES6规定以一定模式从数组、对象中提取值&#xff0c;然后给变量赋值叫做解构。 本质上就是一种匹配模式&#xff0c;等号两边模式相同&#xff0c;左边的变量就能对应的值。 假如解构不成功会赋值为undefined。 不需要匹配的位置可以置空 let [ a, b, c] …...

Dijkstra 邻接表表示算法 | 贪心算法实现--附C++/JAVA实现源码

以下是详细步骤。 创建大小为 V 的最小堆,其中 V 是给定图中的顶点数。最小堆的每个节点包含顶点编号和顶点的距离值。 以源顶点为根初始化最小堆(分配给源顶点的距离值为0)。分配给所有其他顶点的距离值为 INF(无限)。 当最小堆不为空时,执行以下操作: 从最小堆中提取…...

从城市吉祥物进化到虚拟人IP需要哪些步骤?

在2023年成都全国科普日主场活动中&#xff0c;推出了全国首个科普数字形象大使“科普熊猫”&#xff0c;科普熊猫作为成都科普吉祥物&#xff0c;是如何进化为虚拟人IP&#xff0c;通过动作捕捉、AR等技术&#xff0c;活灵活现地出现在大众眼前的&#xff1f; 以广州虚拟动力虚…...

认识SQLServer

深入认识SQL Server&#xff1a;从基础到高级的数据库管理 在当今数字时代&#xff0c;数据是企业成功的关键。为了存储、管理和分析数据&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;变得至关重要。其中&#xff0c;Microsoft SQL Server是一款备受欢迎的关系型数据…...

Python开发IDE的比较:PyCharm vs. VS Code vs. Jupyter

Python开发IDE的比较&#xff1a;PyCharm vs. VS Code vs. Jupyter Python开发社区中已经存在了相当长时间的持续争论&#xff1a;PyCharm vs. VS Code vs. Jupyter。 PyCharm&#xff1a;专业人士的选择 让我们从PyCharm开始。它是一个功能强大的集成开发环境&#xff08;I…...

1206. 设计跳表

不使用任何库函数&#xff0c;设计一个 跳表 。 class Skiplist {int level0;Node headnull;public Skiplist() {}public boolean search(int target) {Node curhead;while(cur!null){while(cur.right!null&&cur.right.val<target){curcur.right;}if(cur.right!nul…...

【API要返回一棵树的结构】数据库表结构是平铺的数据,但是api要实现树状结构展示。api实现一棵树的结构,如何实现呢,递归?如何递归呢

数据库中的数据是平铺的&#xff0c;一行行的&#xff0c;但是api要查询出来的数据要求是一棵树的结构&#xff0c; 怎么把平铺的数据转换成树状结构呢&#xff1f; public List<CarbonRepo> findCarbonRepo(Integer type){// 1. 先查出所有数据。 baseFindList 方法就是…...

视频批量剪辑工具,自定义视频速率,批量剪辑工具助力创意无限”

在视频制作的世界里&#xff0c;每一个细节都至关重要。今天&#xff0c;让我们来探索一项强大且创新的功能——自定义视频速率。利用它&#xff0c;你可以轻松地调整视频播放速度&#xff0c;赋予你的作品独特的个性和风格。 首先第一步&#xff0c;我们要打开好简单批量智剪…...

starrocks启动和停止和重启脚本

StarRocks启动和停止和重启脚本 编辑脚本&#xff1a;vim start_stop_starrocks.sh 备注:IP修改为自己的IP即可 #!/bin/bashcase $1 in "start"){for i in 12.3.7.147 12.3.7.148 12.3.7.149 12.3.7.150doecho " --------启动 $i be -------"ssh $i &qu…...

升级Xcode 15后,出现大量Duplicate symbols问题

https://developer.apple.com/forums/thread/731090 升级到Xcode 15后&#xff0c;原先Xcode14可以编译的项目出现大量Duplicate symbols&#xff0c;且引用报错指向同一个路径&#xff08;一般为Framework&#xff09;下的同一个文件。经过查找相关解决&#xff0c;可通过添加…...

Godot2D角色导航教程(角色随鼠标移动)

文章目录 运行结果2D导航概述开始前的准备2D导航创建导航网格创建角色 其他文章 运行结果 2D导航概述 Godot为2D和3D游戏提供了多个对象、类和服务器&#xff0c;以便于基于网格或基于网格的导航和路径查找。 说到导航&#xff0c;就得说一下导航网格&#xff0c;导航网格定义…...

论文阅读--Cell-free massive MIMO versus small cells

无蜂窝大规模MIMO与小蜂窝网络 论文信息 Ngo H Q, Ashikhmin A, Yang H, et al. Cell-free massive MIMO versus small cells[J]. IEEE Transactions on Wireless Communications, 2017, 16(3): 1834-1850. 无蜂窝大规模MIMO中没有小区或者小区边界的界定&#xff0c;所有接入…...

【深度学习】UniControl 一个统一的扩散模型用于可控的野外视觉生成

论文&#xff1a;https://arxiv.org/abs/2305.11147 代码&#xff1a;https://github.com/salesforce/UniControl#data-preparation docker快速部署&#xff1a;https://qq742971636.blog.csdn.net/article/details/133129146 文章目录 AbstractIntroductionRelated WorksUniCo…...

使用ChatGPT和MindShow一分钟生成PPT模板

对于最近学校组织的实习答辩&#xff0c;由于时间太短了&#xff0c;而且小编也特别的忙&#xff0c;于是就用ChatGPT结合MindShow一分钟快速生成PPT&#xff0c;确实很实用。只要你跟着小编后面&#xff0c;你也可以快速制作出这个PPT&#xff0c;下面小编就来详细介绍一下&am…...

C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化或反序列化报错解决方法

一、问题描述 在使用C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化报错【System.Exception:“不支持类型 System.Collections.Generic.Dictionary2[[System.String, mscorlib, Version2.0.0.0, Cultureneutral, PublicKeyTokenb77a5c561934e089],[System.Strin…...

【Linux】Linux 之用户管理

Linux 之用户管理 1.Linux 下的用户2.配置文件3.用户管理3.1 useradd3.1.1 创建用户并指定用户 ID3.1.2 指定用户的主目录3.1.3 指定用户的主组 3.2 adduser3.3 userdel3.4 密码文件3.4.1 字段含义解释3.4.2 给用户添加密码 3.5 其他与用户相关的命令 4.修改用户的信息4.1 user…...

NLP:Attention和self-attention的区别

核心思想是根据不同的上下文为不同的信息分配不同的注意力权重 效果&#xff1a; Attention&#xff1a;它允许模型在解码时聚焦于输入的特定部分&#xff0c;从而更好地捕获上下文信息。Self-attention&#xff1a;它帮助模型捕获输入序列内部的关系&#xff0c;无论这些关系…...

Gap Year Plan

Gap Year Plan gap year 几个大方向 健康 60 KG10 新朋友 钱 5W RMB基本常识、社会机制补齐开网店 英语 TOELF日常交流 & 面试 口语Science Research Writing 2nd 课程 科研常识CMU 15-445MIT 6.824CMU 15-721Full Stack OpenDDIA 实习 GSOC 2024 PostgreSQL / …...

厌烦了iPhone默认的热点名称?如何更改iPhone上的热点名称

你对你默认的热点名称感到厌倦了吗&#xff1f;这篇文章是为你准备的。在这里&#xff0c;你可以了解如何轻松更改iPhone上的热点名称。 个人热点会将你的手机数据转换为Wi-Fi信号。手机上的个人热点使用户能够与其他用户共享其蜂窝数据连接。当你在WIFI网络之外时&#xff0c…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...