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

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

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

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

相关文章

vue前端代码作业——待办事项

美化样式示意图: 后端IDEA代码示意图: 代码解释: 1. isAllChecked 计算属性的作用 isAllChecked 用于实现 “全选 / 全不选” 功能,它是一个 双向绑定 的计算属性(因为 v-model 需要同时支持读取和设置值&#xff09…

Oracle数据库数据编程SQL<3.1 PL/SQL 匿名块 及 流程控制中的条件判断、循环、异常处理和随机函数应用>

PL/SQL部分 在SQL的基础上增加了一些过程化的控制语句。 过程化控制语句包括:类型定义、判断、循环、游标、异常处理(例外处理) 目录 PL/SQL匿名块 一、匿名块基本结构 1、匿名块由三个部分组成: 2、注意事项: …

DeepSeek详解:探索下一代语言模型

文章目录 前言一、什么是DeepSeek二、DeepSeek核心技术2.1 Transformer架构2.1.1 自注意力机制 (Self-Attention Mechanism)(a) 核心思想(b) 计算过程(c) 代码实现 2.1.2 多头注意力 (Multi-Head Attention)(a) 核心思想(b) 工作原理(c) 数学描述(d) 代码实现 2.1.3 位置编码 (…

Git Reset 命令详解与实用示例

文章目录 Git Reset 命令详解与实用示例git reset 主要选项git reset 示例1. 撤销最近一次提交(但保留更改)2. 撤销最近一次提交,并清除暂存区3. 彻底撤销提交,并丢弃所有更改4. 回退到特定的提交5. 取消暂存的文件 git reset 与 …

前端知识点---事件监听器里面的e.target跟this的区别,e.target在事件委托中的好处

文章目录 ✅ 相同点✅ 不同点✅ 总结区别e.target与事件委托之间的关系 在事件监听器中,e.target 和 this 有时是一样的,但它们并不完全相同。 ✅ 相同点 当事件直接绑定到元素时: e.target 和 this 通常指向相同的元素,即事件绑…

Elasticsearch 完全指南

1. Elasticsearch基础知识 1.1 什么是Elasticsearch Elasticsearch是一个基于Lucene的分布式、RESTful风格的搜索和数据分析引擎。它是一个开源的、高扩展的、分布式的全文搜索引擎,可以近乎实时地存储、检索数据。 Elasticsearch不仅仅是一个全文搜索引擎,它还可以用于以…

Python 3 与 MySQL 数据库连接:mysql-connector 模块详解

Python 3 与 MySQL 数据库连接:mysql-connector 模块详解 概述 在Python 3中,与MySQL数据库进行交互是一个常见的需求。mysql-connector是一个流行的Python模块,它提供了与MySQL数据库连接和交互的接口。本文将详细介绍mysql-connector模块…

SQL:CASE WHEN使用详解

文章目录 1. 数据转换与映射2. 动态条件筛选3. 多条件分组统计4. 数据排名与分级5. 处理空值与默认值6. 动态排序 CASE WHEN 语句在 SQL 中是一个非常强大且灵活的工具,除了常规的条件判断外,还有很多巧妙的用法,以下为你详细总结&#xff1a…

【字符设备驱动开发–IMX6ULL】(二)Linux 设备号

【字符设备驱动开发–IMX6ULL】(二)Linux 设备号 文章目录 【字符设备驱动开发–IMX6ULL】(二)Linux 设备号1 设备号的组成2.设备号的分配 1 设备号的组成 为了方便管理,Linux 中每个设备都有一个设备号,设…

【字符设备驱动开发–IMX6ULL】(一)简介

【字符设备驱动开发–IMX6ULL】(一)简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 ​ 1、底层,跟寄存器打交道,有些MCU提供了库。 spi.c:主机驱动(换成任何一个设备之后只需要调用此文件里面的…

YOLOv8+ Deepsort+Pyqt5车速检测系统

该系统通过YOLOv8进行高效的目标检测与分割,结合DeepSORT算法完成目标的实时跟踪,并利用GPU加速技术提升处理速度。系统支持模块化设计,可导入其他权重文件以适应不同场景需求,同时提供自定义配置选项,如显示标签和保存…

蓝桥杯嵌入式学习笔记

用博客来记录一下参加蓝桥杯嵌入式第十六届省赛的学习经历 工具环境准备cubemx配置外部高速时钟使能设置串口时钟配置项目配置 keil配置烧录方式注意代码规范头文件配置 模块ledcubemx配置keil代码实现点亮一只灯实现具体操作的灯,以及点亮还是熄灭 按键cubemx配置k…

ARCGIS PRO SDK VB2022 图层要素类类型判断

arcgis pro 常见要素类类型有以下几种: FeatureLayer ——要素图层(矢量数据) RasterLayer ——栅格图层 MapImageLayer ——地图图像图层 VectorTileLayer ——矢量切片图层 SceneLayer …

【hadoop】远程调试环境

根据上一节,我们已经安装完成hadoop伪分布式环境 hadoop集群环境配置_jdk1.8 441-CSDN博客 还没安装的小伙伴可以看看这个帖子 这一节我们要实现使用vscode进行远程连接,并且完成java配置与测试 目录 vscode 配置远程 安装java插件 新建java项目 …

Java版Manus实现来了,Spring AI Alibaba发布开源OpenManus实现

此次官方发布的 Spring AI Alibaba OpenManus 实现,包含完整的多智能体任务规划、思考与执行流程,可以让开发者体验 Java 版本的多智能体效果。它能够根据用户的问题进行分析,操作浏览器,执行代码等来完成复杂任务等。 项目源码及…

【Linux网络与网络编程】02.初识Socket编程

1. 数据传输的目的 前一篇文章中我们讲解了网络传输的流程,那么网络传输的目的是什么呢?难道我们只是将数据从一台主机传输到另一台主机吗? 当然不是的!因为数据是给人用的。比如:聊天是人在聊天,下载是人…

电脑连不上手机热点会出现的小bug

一、问题展示 注意: 不要打开 隐藏热点 否则他就会在电脑上 找不到自己的热点 二、解决办法 把隐藏热点打开即可

CUDA专题3:为什么GPU能改变计算?深度剖析架构、CUDA®与可扩展编程

1. 简介 1.1. 使用 GPU 的优势 图形处理器(GPU)在相近的成本和功耗范围内,能够提供比中央处理器(CPU)更高的指令吞吐量和内存带宽。许多应用程序利用这些优势,在 GPU 上的运行速度远超 CPU(参见《GPU 应用》)。其他计算设备(如 FPGA)虽然能效也很高,但其编程灵活性…

Linux输入系统应用编程

什么是输入系统 Linux 输入系统是处理用户输入设备(如键盘、鼠标、触摸屏、游戏手柄等)的软件架构。在应用编程层面,它提供了与这些输入设备交互的接口。 主要组成部分 输入设备驱动层:直接与硬件交互的驱动程序 输入核心层:内核中的输入子…

StarRocks BE宕机排查

StarRocks BE宕机排查 排查是否OOM dmesg -T|grep -i oom #排查是否oom原因: 2.X版本OOM原因 BE 的配置文件 (be.conf) 中 mem_limit 配置不合理,需要配置mem_limit(机器总内存-其他服务占用内存-1~2g(系统预留)) 比如机器内存40G,上面有…