MySQL 当中的锁

news2025/4/1 21:23:26

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 遇到锁立即返回错误而非等待,应用场景是“快速失败场景”。

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

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

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

相关文章

[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…

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

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

【STL】queue

q u e u e queue queue 是一种容器适配器,设计为先进先出( 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)的数据结构,有两个出口,将元素推入队列的操作称为 p u …

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” 代表多种不同通信协议,能将近 200 种协议同时转为 Modbus RTU 和 TCP 服务器 。支持 PC、手机端等访问监控,可解决组态软件连接不常见控制设备难题,广泛…

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

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

PS底纹教程

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

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

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

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

对于高精度乘法和加法的同学可以学学这几个题 高精度乘法 高精度加法 文章目录 题意分析部分解全解 后言 题意 给出一个整数和一个浮点数,求2的整数次幂和这个浮点数相乘的结果最后四舍五入。、 分析 我们可以发现,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_…

回调后门基础

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

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

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

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

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

聚类(Clustering)基础知识3

文章目录 一、聚类的性能评价1、聚类性能评价(1)聚类性能评价方法: 2、参考模型 (reference model)(1)数据集:(2)聚类结果:(3)参考模型&#xff1…

RK3588使用笔记:设置程序/服务开机自启

一、前言 一般将系统用作嵌入式设备时肯定要布置某些程序,这时候就需要对程序设置开机自己,否则每次都要人为启动,当有些嵌入式系统未连接显示屏或者无桌面环境去操作启动程序时,程序自启就是必须的了,本文介绍在纯li…

python实现股票数据可视化

最近在做一个涉及到股票数据清洗及预测的项目,项目中需要用到可视化股票数据这一功能,这里我与大家分享一下股票数据可视化的一些基本方法。 股票数据获取 目前,我已知的使用python来获取股票数据方式有以下三种: 爬虫获取,实现…

JavaScript DOM与元素操作

目录 DOM 树、DOM 对象、元素操作 一、DOM 树与 DOM 对象 二、获取 DOM 元素 1. 基础方法 2. 现代方法(ES6) 三、修改元素内容 四、修改元素常见属性 1. 标准属性 2. 通用方法 五、通过 style 修改样式 六、通过类名修改样式 1. className 属…