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

MySQL 当中的锁

MySQL 当中的锁

文章目录

  • MySQL 当中的锁
    • MySQL 中有哪些主要类型的锁?请简要说明
    • MySQL 的全局锁有什么用?
    • MySQL 的表级锁有哪些?作用是什么?
      • 元数据锁(MetaData Lock,MDL)
      • 意向锁(Intention Locks)
      • 自增锁(AUTO-INC Locks)
    • MySQL 的行级锁有哪些?作用是什么?
      • 记录锁
      • 间隙锁
      • 临键锁
      • 插入意向锁
    • 什么情况下 InnoDB 的行级锁会升级为表级锁?
    • 什么是死锁?MySQL 中如何检测和处理死锁?
    • 解释意向锁的作用及其工作原理
    • 什么是乐观锁和悲观锁?MySQL 中如何实现?
    • 解释 MySQL 8.0 新增的 SKIP LOCKED 和 NOWAIT 特性

本篇文章对 MySQL 当中的锁机制进行学习,具体的参考资料来自 csview,参考链接如下:https://www.csview.cn/mysql/lock.html。
在这里插入图片描述

MySQL 中有哪些主要类型的锁?请简要说明

按锁粒度划分

  • 表级锁:锁定整张表;
  • 行级锁:锁定表中的行;
  • 页级锁:锁定数据页;

按锁的性质划分

  • 共享锁(S锁):允许并发读,阻塞写;
  • 排他锁(X锁):禁止任何其他锁;
  • 意向锁:表明事务将要获取的锁类型;

特殊锁

  • 元数据锁:属于表级锁,用于保护表结构在事务执行期间不被修改;
  • 自增锁:同样属于表级锁,用于保护自增主键的列,以确保主键的递增性;
  • 间隙锁:属于行级锁,主要用于在可重复读隔离级别下解决幻读问题。

MySQL 的全局锁有什么用?

作用
整个数据库将处于只读状态,增删改会被阻塞。

使用场景
全局锁主要用于做全库逻辑备份

缺陷
当数据库中记录过多时,备份会花费很多时间。备份期间,业务职能读数据,而不能更新数据,这样会造成业务停滞。

改进
在可重复读隔离级别下,备份数据库之前会先开启事务,会先创建 Read View,然后整个事务执行期间都使用这个 Read View。由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。即使其他事务更新了表的数据,也不会备份数据库时的 Read View,这样备份期间备份的数据一直是事务开启时的数据。

MySQL 的表级锁有哪些?作用是什么?

元数据锁(MetaData Lock,MDL)

当事务访问数据库当中的表时,自动为表加 MDL 锁。作用是防止表的结构被修改,保证表结构的一致性。MDL 在事务提交后才会被释放。

意向锁(Intention Locks)

意向锁为 InnoDB 引擎所独有。意向锁进一步细分为意向共享锁和意向排他锁。

  • 意向共享锁(IS):表示事务打算在表中的某些行上设置共享锁;
  • 意向排他锁(IX):表示事务打算在表中的某些行上设置排他锁;

意向锁的作用是快速判断表里是否有记录被加锁,以:

  • 提高锁冲突检测效率;
  • 避免逐行检测锁状态。

自增锁(AUTO-INC Locks)

作用
表中主键通常会被设置为自增,之后在插入数据时,可以不指定主键的值,数据库会自动给这条新增的记录的主键赋值,通过 AUTO-INC 锁来实现。具体来说,在插入数据时,会加一个表级的 AUTO-INC 锁,然后为被 AUTO_INCREMENT 修饰的字段赋递增的主键值。待插入语句完毕时,才会把 AUTO-INC 锁释放掉。在此期间,其他事务若想要向该表插入数据,都将被阻塞,从而保证插入数据的字段的值是连续递增的。

缺陷
大量数据插入的场景下,会影响数据库的性能。

改进
InnoDB 提供了一种轻量级锁实现自增。插入数据时,会为 AUTO_INCREMENT 修饰的字段加上轻量级锁,然后给该字段赋一个自增值,之后就释放轻量级锁,而不需要等待整个插入语句执行完毕才释放锁。

MySQL 的行级锁有哪些?作用是什么?

记录锁

细分为排他锁和共享锁,锁住表中的单条记录。

当表没有索引时,记录锁将锁定隐式主键。

间隙锁

间隙锁仅用于可重复读隔离级别,目的是为了解决该级别下的幻读现象。间隙锁确保数据表当中的某个区间的记录不会被修改。两个事务可以同时持有包含相同间隙范围的间隙锁,不存在互斥关系。

临键锁

临键锁是记录锁和间隙锁的组合,它会锁定一个范围,并且锁定记录本身。临键锁既能保护该记录,又能防止其它事务将新记录插入到被保护的记录前面的间隙当中。

临键锁是 InnoDB 默认的行锁算法(注意,可重复读隔离级别也是 InnoDB 默认的隔离级别,由于临键锁包含间隙锁,而间隙锁只能用于可重复读隔离级别,意味着临键锁也只能用于可重复读隔离级别)。

插入意向锁

一个事务在插入记录时,需要判断插入位置是否被其它事务加了间隙锁。如果有锁,插入操作会阻塞,直到拥有间隙锁的那个事务执行完毕提交为止,在此期间会生成一个插入意向锁,表明当前有事务想要在某个区间插入新记录,但目前处于等待状态。

什么情况下 InnoDB 的行级锁会升级为表级锁?

  1. 无合适索引:当 SQL 语句不能通过索引过滤数据时,会导致全表扫描;
  2. 高比例锁定:当要锁定的数据超过阈值时,行锁升级为表锁;
  3. 显式请求:使用 LOCK TABLES 语句明确要求表锁时;
  4. 特定 DDL 操作:如执行 ALTER TABLE 等操作时;

什么是死锁?MySQL 中如何检测和处理死锁?

死锁指的是两个或多个事务互相持有和请求锁资源,形成循环等待情况。

MySQL 检测和处理死锁的方式:
检测机制

  • 使用等待图(wait-for graph)算法;
  • 定期检查锁依赖关系;

处理方式

  • 选择回滚代价最小的事务作为牺牲者;
  • 返回 ERROR 1213 死锁错误;
  • 其他事务可以继续执行。

解释意向锁的作用及其工作原理

意向锁是表级锁,用于提高行锁冲突检测效率。

意向锁的作用是:

  1. 表明事务即将在表的某些行上加何种类型的锁;
  2. 避免逐行检查锁的状态,提高性能。

意向锁的类型:

  • 意向共享锁(IS):表明事务打算在某些行上加 S 锁;
  • 意向排他锁(IX):表明事务打算在某些行上加 X 锁。

什么是乐观锁和悲观锁?MySQL 中如何实现?

悲观锁假设会发生冲突,故先加锁再访问:

SELECT * FROM table WHERE id = 1 FOR UPDATE:
SELECT * FROM table WHERE id = 1 LOCK IN SHARE MODE;

乐观锁假设不会发生冲突,提交时检查版本:
添加版本号字段:

ALTER TABLE products ADD COLUMN version INT DEFAULT 0;

更新时检查:

UPDATE products
SET stock.= stock - 1, version = version + 1
WHERE id = 1 AND version = 1;

检查影响行数确认是否成功。

解释 MySQL 8.0 新增的 SKIP LOCKED 和 NOWAIT 特性

SKIP LOCKED 跳过已被锁定的行,应用场景是“任务队列处理”。

NOWAIT 遇到锁立即返回错误而非等待,应用场景是“快速失败场景”。

上述两个特性特别适合高并发队列系统和需要快速响应的应用。

相关文章:

MySQL 当中的锁

MySQL 当中的锁 文章目录 MySQL 当中的锁MySQL 中有哪些主要类型的锁?请简要说明MySQL 的全局锁有什么用?MySQL 的表级锁有哪些?作用是什么?元数据锁(MetaData Lock,MDL)意向锁(Inte…...

fyrox 2D和3D游戏的制作

目录 fyrox介绍 1. 核心特性 1.1 高性能渲染 1.2 跨平台支持 1.3 物理引擎集成 1.4 脚本系统 1.5 场景管理 2. 架构设计 2.1 渲染器 2.2 资源管理器 2.3 输入系统 2.4 音频引擎 2.5 网络模块 3. 使用场景 3.1 2D游戏 3.2 3D游戏 3.3 模拟与教育应用 4. 在游戏…...

[Linux]基础IO

基础IO C文件IO相关操作磁盘文件与内存文件inode(index node)硬链接与软连接硬链接软连接总结 动静态库静态库动态库总结 C文件IO相关操作 当前路径:进程运行的时候,所处的路径叫做当前路径 打开文件的时候,一定是进…...

力扣刷题-热题100题-第27题(c++、python)

21. 合并两个有序链表 - 力扣(LeetCode)https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 创建一个新链表,遍历list1与list2,将新链表指向list1与list2…...

Vue3 其它API Teleport 传送门

Vue3 其它API Teleport 传送门 在定义一个模态框时,父组件的filter属性会影响子组件的position属性,导致模态框定位错误使用Teleport解决这个问题把模态框代码传送到body标签下...

windows下安装sublime

sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…...

golang 的strconv包常用方法

目录 1. 字符串与整数的转换 2. 字符串与浮点数的转换 3. 布尔值的转换 4. 字符串的转义 5. 补充:rune 类型的使用 方法功能详解 代码示例: 1. 字符串与整数的转换 方法名称功能描述示例Atoi将字符串转换为十进制整数。strconv.Atoi("123&q…...

ComplexE的代码注释

目录 dataloader.pymodel.pyrun.py 先安装软件,配置环境,搞了一周。再看代码写注释搞了一周。中间隔了一周。再安装环境跑代码又一周。最后结果是没结果。自己电脑内存带不动。还不想配电脑,又不会用GPU服务器。哭死哭死。心态崩了。直接发吧…...

vector<int> 的用法

vector<int> 是 C 标准模板库(STL)中的一个容器&#xff0c;用于存储动态大小的整数序列。以下是它的主要用法&#xff1a; 基本操作 1. 创建和初始化 #include <vector> using namespace std;vector<int> v1; // 空vector vector<int>…...

Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器

JVM是Java高级部分&#xff0c;深入理解程序的运行及原理&#xff0c;面试中也问的比较多。 JVM是Java程序运行的虚拟机环境&#xff0c;实现了“一次编写&#xff0c;到处运行”。它负责将字节码解释或编译为机器码&#xff0c;管理内存和资源&#xff0c;并提供运行时环境&a…...

名言警句1

1、嫉妒是欲望的衍生&#xff0c;而欲望则是成长的驱动&#xff0c;说到底每个人都是为了成长&#xff0c;为了不居人后&#xff0c;在成长的过程中&#xff0c;我们可以让欲望枝繁叶茂&#xff0c;但不能让嫉妒开花结果 2、人生无法奢求更多&#xff0c;我们有健康的身体&…...

【STL】queue

q u e u e queue queue 是一种容器适配器&#xff0c;设计为先进先出&#xff08; F i r s t I n F i r s t O u t , F I F O First\ In\ First\ Out,\ FIFO First In First Out, FIFO&#xff09;的数据结构&#xff0c;有两个出口&#xff0c;将元素推入队列的操作称为 p u …...

QXmpp入门

QXmpp 是一个基于 Qt 的 XMPP (Jabber) 协议实现库,用于开发即时通讯(IM)、聊天应用和实时协作系统。它支持客户端和服务端开发,提供完整的 XMPP 核心功能扩展。 1. 核心功能 XMPP 核心协议支持 支持 RFC 6120 (XMPP Core) 和 RFC 6121 (XMPP IM) 基础功能:认证、在线状态…...

使用cursor为代码添加注释

1. add-comments.md英文 You are tasked with adding comments to a piece of code to make it more understandable for AI systems or human developers. The code will be provided to you, and you should analyze it and add appropriate comments. To add comments to …...

20250330-傅里叶级数专题之离散时间傅里叶变换(4/6)

4. 傅里叶级数专题之离散时间傅里叶变换 20250328-傅里叶级数专题之数学基础(0/6)-CSDN博客20250330-傅里叶级数专题之傅里叶级数(1/6)-CSDN博客20250330-傅里叶级数专题之傅里叶变换(2/6)-CSDN博客20250330-傅里叶级数专题之离散傅里叶级数(3/6)-CSDN博客20250330-傅里叶级数专…...

漏洞挖掘---迅饶科技X2Modbus网关-GetUser信息泄露漏洞

一、迅饶科技 X2Modbus 网关 迅饶科技 X2Modbus 网关是功能强大的协议转换利器。“X” 代表多种不同通信协议&#xff0c;能将近 200 种协议同时转为 Modbus RTU 和 TCP 服务器 。支持 PC、手机端等访问监控&#xff0c;可解决组态软件连接不常见控制设备难题&#xff0c;广泛…...

Java进阶——位运算

位运算直接操作二进制位&#xff0c;在处理底层数据、加密算法、图像处理等领域具有高效性能和效率。本文将深入探讨Java中的位运算。 本文目录 一、位运算简介1. 与运算2. 或运算异或运算取反运算左移运算右移运算无符号右移运算 二、位运算的实际应用1. 权限管理2. 交换两个变…...

golang strings包常用方法

方法名称功能描述示例strings.Join将字符串切片中的元素连接成一个字符串&#xff0c;使用指定的分隔符。strings.Join([]string{"hello", "world"}, " ")strings.HasPrefix检查字符串是否以指定的前缀开头。strings.HasPrefix("hello"…...

网络安全之前端学习(css篇2)

那么今天我们继续来学习css&#xff0c;预计这一章跟完后&#xff0c;下一章就是终章。然后就会开始js的学习。那么话不多说&#xff0c;我们开始吧。 字体属性 之前讲到了css可以改变字体属性&#xff0c;那么这里来详细讲一讲。 1.1字体颜色 之前讲到了对于字体改变颜色食…...

PS底纹教程

1.ctrlshiftU 去色 2.新建纯色层 颜色中性灰&#xff1b;转换为智能对象 3.纯色层打开滤镜&#xff08;滤镜库&#xff09;&#xff1b; 素描下找到半调图案&#xff0c;数值调成大小5对比1&#xff1b; 再新建一层&#xff0c;素描下找到撕边&#xff0c;对比拉到1&#x…...

NX/UG二次开发—CAM获取加工操作的最低Z深度值的方法

网上已经有些大佬给出了解决方案&#xff0c;但是基本有两种&#xff0c;一种内部函数&#xff0c;另外一种就是导出程序的刀轨文件找坐标计算。使用内部函数进行操作&#xff0c;可以自己学习&#xff0c;不做解释。下面只是针对第二种进行说明&#xff0c;参考胡君老师的教程…...

解决pyinstaller GUI打包时无法打包图片问题

当我们的python GuI在开发时。经常会用到图片作为背景&#xff0c;但是在打包后再启动GUI后却发现&#xff1a;原先调试时好端端的背景图片竟然不翼而飞或者直接报错。这说明图片没有被pyinstaller一起打包…… 要解决这个问题很简单&#xff0c;就是更改图片的存储方式。 tk…...

蓝桥杯真题------R格式(高精度乘法,高精度加法)

对于高精度乘法和加法的同学可以学学这几个题 高精度乘法 高精度加法 文章目录 题意分析部分解全解 后言 题意 给出一个整数和一个浮点数&#xff0c;求2的整数次幂和这个浮点数相乘的结果最后四舍五入。、 分析 我们可以发现&#xff0c;n的范围是1000,2的1000次方非常大&am…...

Nginx — Nginx安装证书模块(配置HTTPS和TCPS)

一、安装和编译证书模块 [rootmaster nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz [rootmaster nginx]# tar -zxvf nginx-1.25.3.tar.gz [rootmaster nginx]# cd nginx-1.25.3 [rootmaster nginx]# ./configure --prefix/usr/local/nginx --with-http_stub_…...

回调后门基础

回调后门概述 回调后门&#xff08;Reverse Shell&#xff09;是一种常见的攻击方式&#xff0c;攻击者通过受害主机主动连接到远程服务器&#xff08;攻击者控制的机器&#xff09;&#xff0c;从而获得远程控制权限。 工作原理 受害者主机 运行一个恶意代码&#xff0c;尝…...

深度学习 Deep Learning 第13章 线性因子模型

深度学习 Deep Learning 第13章 线性因子模型 内容概要 本章深入探讨了线性因子模型&#xff0c;这是一类基于潜在变量的概率模型&#xff0c;用于描述数据的生成过程。这些模型通过简单的线性解码器和噪声项捕捉数据的复杂结构&#xff0c;广泛应用于信号分离、特征提取和数…...

【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis

基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码&#xff0c;通过ArithmeticCaptcha生成一张验证码图片&#xff0c;通过text()函数得到验证码的答案保存到变量code&#xff0c;然后把图…...

华为OD机试2025A卷 - 正则表达式替换(Java Python JS C++ C )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 为了便于业务互交,约定一个对输入的字符串中的下划线做统一替换。 具体要求如下: 输入字符串,将其中包含的每一个下划线“_”,使用特殊字符串(^|$|[,+])替换,并输出替换后的结果…...

WPS宏开发手册——Excel常用Api

目录 系列文章4、Excel常用Api4.1、判断是否是目标工作excel4.2、获取源工作表和目标工作表的引用4.3、获取单元格的值4.4、设置单元格的值4.5、合并单元格4.6、获取源范围4.7、获取源范围行数4.8、通过源来获取单元格的值4.9、设置单元格的背景颜色4.10、设置单元格的文字颜色…...

数据库基础入门

关系型数据库 vs. 非关系型数据库SQL 基础 & ORM 框架使用一、数据库概述 数据库(Database)是 存储和管理数据 的系统,主要分为 关系型数据库(Relational Database) 和 非关系型数据库(NoSQL)。 📌 数据库的作用: ✅ 存储:持久化数据,避免数据丢失。 ✅ 管理…...