从锁的类别角度讲,MySQL都有哪些锁

news2024/12/26 23:40:23

在这里插入图片描述

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。
🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。
🏆本文已收录于PHP专栏:MySQL的100个知识点。
🎉欢迎 👍点赞✍评论⭐收藏

文章目录

  • 一、前言
  • 二、共享锁
  • 三、排他锁
  • 四、MySQL锁分类及使用示例
    • 4.1 共享锁(Shared Lock)
    • 4.2 排他锁(Exclusive Lock)
    • 4.3 意向共享锁(Intention Shared Lock)和意向排他锁(Intention Exclusive Lock)
  • 五、总结


一、前言

从锁的类别角度来讲,MySQL主要有两种类型的锁:共享锁(Shared Lock)和排他锁(Exclusive Lock)。

在这里插入图片描述

二、共享锁

共享锁是用于读取操作的,并且可以被多个会话同时持有。共享锁不会阻塞其他会话持有共享锁,但会阻塞其他会话请求排他锁。示例如下:

-- 会话1
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' LOCK IN SHARE MODE;
-- 执行读取操作

-- 会话2
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' LOCK IN SHARE MODE;
-- 执行读取操作

在上面的示例中,会话1和会话2都持有一个共享锁来读取表中的数据。由于共享锁可以同时被多个会话持有,所以这里不会出现阻塞的情况。

三、排他锁

排他锁是用于写入操作的,并且只能被单个会话持有。排他锁会阻塞其他会话请求排他锁和共享锁。示例如下:

-- 会话1
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' FOR UPDATE;
-- 执行读取并加上排他锁

-- 会话2
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' FOR UPDATE;
-- 这个查询将会被阻塞,直到会话1释放排他锁

-- 会话1
UPDATE table_name SET column_name = 'new_value' WHERE column_name = 'value';
COMMIT;
-- 释放排他锁,允许会话2继续执行

-- 会话2
SELECT * FROM table_name WHERE column_name = 'value' FOR UPDATE;
-- 执行读取并加上排他锁

在上面的示例中,会话1先获取了一个排他锁来读取数据,这导致会话2的请求被阻塞。直到会话1释放了排他锁后,会话2才能继续执行。

除了共享锁和排他锁,MySQL还有其他类型的锁,如意向共享锁(Intention Shared Lock)和意向排他锁(Intention Exclusive Lock)。这些锁是用于提高并发性能和减少死锁的。

下面是一个完整的博文:

四、MySQL锁分类及使用示例

在MySQL中,锁是用于控制并发访问的重要机制。通过合理地使用锁,可以提高系统的并发性能,保证数据的一致性。本文将介绍MySQL中的常见锁分类,并给出相应的使用示例。

4.1 共享锁(Shared Lock)

共享锁(也称为读锁)适用于读取操作,可以被多个会话同时持有。共享锁不会阻塞其他会话持有共享锁,但会阻塞其他会话请求排他锁。

示例:假设存在一个名为books的表,我们希望在读取某本书的信息时使用共享锁。

-- 会话1
START TRANSACTION;
SELECT * FROM books WHERE book_id = 123 LOCK IN SHARE MODE;
-- 执行读取操作

-- 会话2
START TRANSACTION;
SELECT * FROM books WHERE book_id = 123 LOCK IN SHARE MODE;
-- 执行读取操作

在上述示例中,会话1和会话2都持有一个共享锁来读取books表中特定书籍的信息。由于共享锁可以同时被多个会话持有,因此不会出现阻塞的情况。

4.2 排他锁(Exclusive Lock)

排他锁(也称为写锁)适用于写入操作,只能被单个会话持有。排他锁会阻塞其他会话请求排他锁和共享锁。

示例:假设存在一个名为books的表,我们希望在更新某本书的信息时使用排他锁。

-- 会话1
START TRANSACTION;
SELECT * FROM books WHERE book_id = 123 FOR UPDATE;
-- 执行读取并加上排他锁

-- 会话2
START TRANSACTION;
SELECT * FROM books WHERE book_id = 123 FOR UPDATE;
-- 这个查询将会被阻塞,直到会话1释放排他锁

-- 会话1
UPDATE books SET price = 10.99 WHERE book_id = 123;
COMMIT;
-- 释放排他锁,允许会话2继续执行

-- 会话2
SELECT * FROM books WHERE book_id = 123 FOR UPDATE;
-- 执行读取并加上排他锁

在上述示例中,会话1首先获取了一个排他锁来读取书籍的信息,这导致会话2的请求被阻塞。直到会话1释放了该排他锁后,会话2才能继续执行。

4.3 意向共享锁(Intention Shared Lock)和意向排他锁(Intention Exclusive Lock)

意向共享锁和意向排他锁是MySQL中的辅助锁机制,用于提高并发性能和减少死锁的可能性。这两种锁不需要用户主动设置,由数据库系统自动管理。

  • 意向共享锁(IS):表示一个事务对数据行有意向地加共享锁。
  • 意向排他锁(IX):表示一个事务对数据行有意向地加排他锁。

示例:假设存在一个名为products的表,我们希望在使用排他锁更新某个产品的销售数量之前,先使用意向共享锁来检查该产品的库存。

-- 会话1
START TRANSACTION;
SELECT * FROM products WHERE product_id = 456 LOCK IN SHARE MODE;
-- 执行读取操作,并加上意向共享锁

-- 会话2
START TRANSACTION;
SELECT * FROM products WHERE product_id = 456 LOCK IN SHARE MODE;
-- 执行读取操作,并加上意向共享锁

-- 会话1
SELECT * FROM products WHERE product_id = 456 FOR UPDATE;
-- 执行读取并加上排他锁

-- 会话2
SELECT * FROM products WHERE product_id = 456 FOR UPDATE;
-- 这个查询将会被阻塞,直到会话1释放排他锁

在上述示例中,会话1和会话2都先获取了一个意向共享锁来读取产品的信息,在使用排他锁更新销售数量之前先进行了检查。这样的设计可以降低死锁的可能性,并提高并发性能。

除了以上介绍的常用锁,MySQL还提供其他类型的锁,如记录锁(Record Lock)和间隙锁(Gap Lock)。这些锁用于更细粒度的并发控制,但需要根据具体的场景来决定是否使用。

在这里插入图片描述

五、总结

在MySQL中,根据锁的类别可以将锁分为共享锁和排他锁。共享锁适用于读取操作,可被多个会话同时持有;排他锁适用于写入操作,只能被单个会话持有。通过合理地使用这些锁,可以实现对数据的并发访问控制,并提高系统的性能与稳定性。

在这里插入图片描述

本文介绍了MySQL中的锁分类,并给出了具体的使用示例。当我们在开发或维护MySQL数据库时,应根据实际需求选择合适的锁来保证数据的一致性和并发性能。同时,还需注意避免死锁的产生,使用锁的过程中应注意事务的隔离级别等相关配置,以充分发挥锁机制的作用。

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

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

相关文章

2024北京老博会,CBIAIE中国北京国际老年产业博览会

2024第11届中国(北京)国际老年产业博览会,将于4月10-12日盛大举行 2024第11届中国(北京)国际老年产业博览会(CBIAIE北京老博会) The 2024 eleventh China (Beijing) International Aged Indust…

【动手学深度学习-Pytorch版】长短期记忆网络LSTM

LSTM参数说明以及网络架构图 PS:时间仓促,有空补充内容~ LSTM从零开始实现 """ 遗忘门:相当于一个橡皮擦,决定保留昨天的哪些信息 输入门:相当于一个铅笔,再次根据昨天的记忆和今天的输…

【数据结构】list.h 详细使用教程 -- 附带例子代码

目录 一、概述二、详细使用步骤✨2.1 定义结构体包含 struct list_head 成员✨2.2 初始化链表头结点:INIT_LIST_HEAD✨2.3 添加结点:list_add、list_add_tail✨2.4 遍历链表:list_for_each、list_for_each_safe、list_for_each_entry✨2.5 获…

java double类型 向上取整,向下取整,四舍五入

向上取整:Math.ceil(double a) 向下取整:Math.floor(double a) 四舍五入取整:Math.round(double a) 直接取整数:intValue() public static void main(String[] args) {Double number 5.3;Double number1 5.8;//向上取整Doubl…

UE5 虚幻引擎 如何使用构造脚本(Construction Script)? 构造脚本的奥秘!

目录 1 构造脚本(Construction Script)1.1 介绍1.2 案例1:利用样条组件程序化生成树木1.2 案例2:利用样条组件和样条网格体组件程序化生成道路 1 构造脚本(Construction Script) 1.1 介绍 问题&#xff1a…

leetcode top100(20) 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,2…

腾讯mini项目-【指标监控服务重构】2023-08-24

今日已办 Jeager 功能 监控分布式工作流程并排除故障识别性能瓶颈追踪根本原因分析服务依赖关系 部署 部署 Deployment — Jaeger documentation (jaegertracing.io) 支持 clickhouse jaegertracing/jaeger-clickhouse: Jaeger ClickHouse storage plugin implementation …

Java8实战-总结34

Java8实战-总结34 重构、测试和调试使用 Lambda 重构面向对象的设计模式观察者模式责任链模式 重构、测试和调试 使用 Lambda 重构面向对象的设计模式 观察者模式 观察者模式是一种比较常见的方案,某些事件发生时(比如状态转变)&#xff0…

Java之转换流的详细解析

2. 转换流 2.1 字符编码和字符集 字符编码 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将…

docker容器安装MongoDB数据库

一:MongoDB数据库 1.1 简介 MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最 像关系型数据库(MySQL)的非关系型数据库。 它支持的数据结构…

封装一个高级查询组件

封装一个高级查询组件 背景一,前端相关代码二,后端相关代码三,呈现效果总结 背景 业务有个按照自定义选择组合查询条件,保存下来每次查询的时候使用的需求。查了一下项目里的代码没有现成的组件可以用,于是封装了一个 …

腾讯mini项目-【指标监控服务重构】2023-08-29

今日已办 Collector 指标聚合 由于没有找到 Prometheus 官方提供的可以聚合指定时间区间内的聚合函数,所以自己对接Prometheus的api来聚合指定容器的cpu_avg、cpu_99th、mem_avg 实现成功后对接小组成员测试完提供的时间序列和相关容器,将数据记录在表格…

相机One Shot标定

1 原理说明 原理部分网上其他文章[1][2]也已经说的比较明白了,这里不再赘述。 2 总体流程 参考论文作者开源的Matlab代码[3]和github上的C代码[4]进行说明(不得不说还是Matlab代码更优雅) 论文方法总体分两部,第一部是在画面中找…

李宏毅hw-9:Explainable ML

——欲速则不达,我已经很幸运了,只要珍惜这份幸运就好了,不必患得患失,慢慢来。 ----查漏补缺: 1.关于这个os.listdir的使用 2.从‘num_文件名.jpg’中提取出数值: 3.slic图像分割标记函数的作用&#xf…

【音视频流媒体】4、摄像头:分辨率、光圈|快门|感光度、焦距

文章目录 一、摄像头分辨率二、光圈、快门、感光度2.1 光圈2.1.1 外观2.1.2 光圈在相机中如何表示的2.1.3 对拍照的影响2.1.4 如何选择合适的光圈2.1.5 光圈在相机中如何设置 2.2 快门2.2.1 外观2.2.2 快门在相机中的表示2.2.3 快门对于拍照有什么影响2.2.4 选择合适的快门2.2.…

【C#】.Net基础语法一

目录 一、程序集信息 【1.1】Properties中AssemblyInfo文件 二、.Net程序的两次编译过程 三、.Net中命名空间和类 【3.1】引入命名空间 【3.2】修改默认的命名空间 【3.3】命名空间的总结 四、.Net中数据类型 【4.1】数值型 【4.2】非数值型 五、.Net中变量 【5.1】…

Selenium WebUI 自动化测试框架

框架结构 框架结构 框架基于 PO 模型进行设计,将页面元素与操作进行拆分,减少页面改动时的维护成本;同时使用 xsd 自定义 xml 标签,通过解析 xml 来驱动 selenium 进行执行,减少了一定的语言学习成本。 主要功能 基于…

[架构之路-221]:鸿蒙系统和安卓系统的比较:微内核VS宏内核, 分布式VS单体式

目录 一、鸿蒙系统和安卓系统的系统架构 1.1 鸿蒙系统的分层架构 1.2 安卓系统的分层架构 1.3 鸿蒙系统和安卓系统是操作系统吗? 二、鸿蒙系统和安卓系统的系统架构比较 2.1 它们与Linux操作系统的关系 2.2 架构比较 三、操作系统基础 3.1 微内核架构 3.2…

leetcode刷题 二维数组 八方向

题目描述 输入:board [[0,1,0],[0,0,1],[1,1,1],[0,0,0]] 输出:[[0,0,0],[1,0,1],[0,1,1],[0,1,0]] 题目分析:就是以二维数组某个元素为中心,寻找周围八个方向的元素,按照题目要求修改二维数组元素返回; 拷贝一份二…

FPGA板卡启动以及LED灯带调试

环境配置 软件: MobaXterm(free版本即可)下载教程参考: MobaXterm(终端工具)下载&安装&使用教程_蜗牛也不慢......的博客-CSDN博客 Win32 Disklmager 下载教程参考: 不分类工具&am…