当前位置: 首页 > 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…...

5分钟精通B站音频提取:从新手到高手的开源工具实战指南

5分钟精通B站音频提取&#xff1a;从新手到高手的开源工具实战指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

在WinForm里玩转Halcon 3D点云:从C#代码导出到完整UI显示的保姆级避坑指南

在WinForm里玩转Halcon 3D点云&#xff1a;从C#代码导出到完整UI显示的保姆级避坑指南 当工业视觉项目需要处理复杂的三维场景时&#xff0c;Halcon的3D点云处理能力往往成为开发者的首选。但将Halcon的强大算法无缝集成到C# WinForm应用中&#xff0c;却可能遭遇一系列"…...

零基础玩转mxbai-embed-large-v1:6大核心功能实战,从向量化到摘要生成

零基础玩转mxbai-embed-large-v1&#xff1a;6大核心功能实战&#xff0c;从向量化到摘要生成 1. 引言&#xff1a;为什么选择mxbai-embed-large-v1&#xff1f; mxbai-embed-large-v1是当前自然语言处理领域的一颗新星&#xff0c;这款多功能句子嵌入模型在MTEB基准测试中表…...

别再混淆了!一文讲透NvDecoder里ulNumDecodeSurfaces和ulNumOutputSurfaces到底怎么用

深入解析NvDecoder&#xff1a;解码缓存与输出缓存的本质区别与实战配置 在视频处理领域&#xff0c;NVIDIA的硬件解码器&#xff08;NVDEC&#xff09;因其出色的性能和高效的资源利用率而广受开发者青睐。然而&#xff0c;对于许多中高级开发者来说&#xff0c;NvDecoder中ul…...

Windows环境下ODBC连接MySQL保姆级教程(含性能优化配置)

Windows环境下ODBC连接MySQL全流程实战指南 1. 环境准备与驱动安装 在Windows平台使用ODBC连接MySQL数据库&#xff0c;首先需要确保开发环境配置正确。与JDBC不同&#xff0c;ODBC作为跨语言的数据库连接标准&#xff0c;其驱动安装过程需要特别注意版本兼容性问题。以下是环境…...

C语言学习笔记——2(数据类型,运算符)

数据类型机器中每个字节都有地址CPU通过地址访问字节空间#include <stdio.h>int main() {int a 0xEEAABAAA;printf("%#x, %d\n",a,a);unsigned int b 0xEEAABAAA;printf("%#x, %u\n",b,b);return 0; }运行结果&#xff1a;0xeeaabaaa, -290800982 …...

手把手教你用MCP+Selenium打造专属内容发布机器人(附避坑指南)

从零构建MCPSelenium自动化发布系统的实战指南 在当今内容为王的数字时代&#xff0c;如何高效管理多平台内容发布成为创作者和企业的核心需求。本文将带您深入探索如何利用MCP协议与Selenium技术栈&#xff0c;打造一个高度定制化的自动化内容发布系统&#xff0c;特别针对小红…...

像素剧本圣殿惊艳案例:故障艺术标题下生成的赛博朋克短剧完整场次

像素剧本圣殿惊艳案例&#xff1a;故障艺术标题下生成的赛博朋克短剧完整场次 1. 像素剧本圣殿创作工具介绍 Pixel Script Temple&#xff08;像素剧本圣殿&#xff09;是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个独特的创作平台将先进的AI推理能力与复…...

Stable Yogi Leather-Dress-Collection效果展示:2.5D视角下皮衣动态褶皱与身体贴合度真实感

Stable Yogi Leather-Dress-Collection效果展示&#xff1a;2.5D视角下皮衣动态褶皱与身体贴合度真实感 想象一下&#xff0c;你是一位动漫角色设计师&#xff0c;需要为角色设计一套充满质感的皮衣。传统的流程需要你手绘线稿、上色、刻画光影和褶皱&#xff0c;整个过程耗时…...

GDBFrontend表达式求值器深度解析:多窗口实时变量监控技巧

GDBFrontend表达式求值器深度解析&#xff1a;多窗口实时变量监控技巧 【免费下载链接】gdb-frontend ☕ GDBFrontend is an easy, flexible and extensible gui debugger. Try it on https://debugme.dev 项目地址: https://gitcode.com/gh_mirrors/gd/gdb-frontend GD…...