MySQL 12种锁:真实业务与流程图解析

文章目录

    • 1. 表级锁(Table Lock)
      • 场景1:全表扫描统计
    • 2. 行级锁(Row Lock)
      • 场景2:修改特定用户信息
    • 3. 全局锁(Global Lock)
      • 场景3:数据备份
    • 4. 意向锁(Intent Lock)
      • 场景4:批量更新特定用户信息
    • 5. 自增锁(AUTO-INC Lock)
      • 场景5:插入新订单
    • 6. 共享锁(Shared Lock)
      • 场景6:读取订单信息
    • 7. 排他锁(Exclusive Lock)
      • 场景7:删除订单
    • 8. Gap Lock
      • 场景8:防止幻读
    • 9. 临键锁(Next-Key Lock)
      • 场景9:防止相邻记录插入
    • 10. 元数据锁(Metadata Lock)
      • 场景10:修改表结构
    • 11. 外键锁(Foreign Key Lock)
      • 场景11:插入有外键约束的数据
    • 12. 二级索引锁(Secondary Index Lock)
      • 场景12:更新包含二级索引的列
    • 结论

在这里插入图片描述

🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:Java学习路线
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

MySQL 提供了多种锁机制以保证数据一致性和完整性。了解和合理使用这些锁机制可以有效提升应用性能和数据安全性。本文将通过12个真实业务场景和相应的流程图,帮助你轻松掌握 MySQL 各种锁的运用场景与方式。

1. 表级锁(Table Lock)

场景1:全表扫描统计

业务需求:统计用户表中所有用户的数量。

流程图:

  1. 请求获取表锁。
  2. 全表扫描统计用户数量。
  3. 释放表锁。
LOCK TABLES users READ;
SELECT COUNT(*) FROM users;
UNLOCK TABLES;

2. 行级锁(Row Lock)

场景2:修改特定用户信息

业务需求:修改某个用户的邮箱地址。

流程图:

  1. 请求获取行级锁。
  2. 更新指定用户的邮箱地址。
  3. 释放行级锁。
BEGIN;
SELECT * FROM users WHERE id = 1 FOR UPDATE;
UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
COMMIT;

3. 全局锁(Global Lock)

场景3:数据备份

业务需求:备份整个数据库。

流程图:

  1. 请求获取全局锁。
  2. 执行数据库备份。
  3. 释放全局锁。
FLUSH TABLES WITH READ LOCK;
-- 执行备份操作
UNLOCK TABLES;

4. 意向锁(Intent Lock)

场景4:批量更新特定用户信息

业务需求:批量更新特定用户的邮箱地址。

流程图:

  1. 请求获取意向锁。
  2. 批量更新用户邮箱地址。
  3. 释放意向锁。
BEGIN;
UPDATE users SET email = 'bulk_update@example.com' WHERE id IN (1, 2, 3);
COMMIT;

5. 自增锁(AUTO-INC Lock)

场景5:插入新订单

业务需求:插入新订单并生成自增订单ID。

流程图:

  1. 请求获取自增锁。
  2. 插入新订单记录。
  3. 释放自增锁。
INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 2, 3);

6. 共享锁(Shared Lock)

场景6:读取订单信息

业务需求:读取特定订单的详细信息。

流程图:

  1. 请求获取共享锁。
  2. 读取订单信息。
  3. 释放共享锁。
SELECT * FROM orders WHERE id = 1 LOCK IN SHARE MODE;

7. 排他锁(Exclusive Lock)

场景7:删除订单

业务需求:删除特定订单。

流程图:

  1. 请求获取排他锁。
  2. 删除订单记录。
  3. 释放排他锁。
BEGIN;
DELETE FROM orders WHERE id = 1;
COMMIT;

8. Gap Lock

场景8:防止幻读

业务需求:防止在某个范围内的插入操作,避免幻读。

流程图:

  1. 请求获取 Gap Lock。
  2. 执行范围查询。
  3. 释放 Gap Lock。
BEGIN;
SELECT * FROM orders WHERE id BETWEEN 1 AND 10 FOR UPDATE;
-- 此时在1到10之间的id无法插入新的记录
COMMIT;

9. 临键锁(Next-Key Lock)

场景9:防止相邻记录插入

业务需求:防止在相邻记录之间插入新的记录。

流程图:

  1. 请求获取临键锁。
  2. 执行查询操作。
  3. 释放临键锁。
BEGIN;
SELECT * FROM orders WHERE id = 5 FOR UPDATE;
-- id为5的相邻记录(如4和6之间)无法插入新的记录
COMMIT;

10. 元数据锁(Metadata Lock)

场景10:修改表结构

业务需求:添加用户表的新列。

流程图:

  1. 请求获取元数据锁。
  2. 修改表结构。
  3. 释放元数据锁。
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

11. 外键锁(Foreign Key Lock)

场景11:插入有外键约束的数据

业务需求:插入包含外键约束的订单记录。

流程图:

  1. 请求获取外键锁。
  2. 插入订单记录。
  3. 释放外键锁。
INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 2, 3);

12. 二级索引锁(Secondary Index Lock)

场景12:更新包含二级索引的列

业务需求:更新用户表中的用户名(该列有二级索引)。

流程图:

  1. 请求获取二级索引锁。
  2. 更新用户名。
  3. 释放二级索引锁。
BEGIN;
UPDATE users SET username = 'new_username' WHERE id = 1;
COMMIT;

结论

通过理解和合理使用 MySQL 提供的各种锁机制,可以显著提升数据库操作的效率和数据安全性。希望本文对你掌握 MySQL 的锁机制有所帮助。如果你有任何问题或建议,欢迎在评论区分享!

以上是 MySQL 12 种锁的真实业务场景和流程图解析,希望能对你在实际开发中有所帮助。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

高性能并行计算华为云实验三:蒙特卡罗算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建蒙特卡罗算法源码 3.2 Makefile的创建与编译 3.3 主机文件配置与运行监测​​​​​​​ 四、实验结果与分析 4.1 原教程对应的实验结果 4.2 改进后的实验结果 五、实验思考与总结 5.1 实验思考 5.2 实验总结…

firewalld(2)安装、配置文件、规则查询

安装firewalld 我使用的操作系统是debian 12,并没有安装firewalld。 通过apt install firewalld安装firewalld firewalld 本身是一个服务(firewalld.service),可以通过 systemctl 进行启动、停止和重启,而iptables 本身并不是一个服务,而是一个用户空间工具,被用来配置底…

论文浅尝 | 通过基于动态文档知识图谱增强的大语言模型故事理解

笔记整理:许方舟,天津大学硕士,研究方向为知识图谱 链接:https://ojs.aaai.org/index.php/AAAI/article/view/21286 1. 动机 基于大型 Transformer 的语言模型在需要叙事理解的各种任务上取得了令人难以置信的成功,包括…

python中容易错误的知识点,仅仅针对于自己

dtype 参数在创建 NumPy ndarray 对象时用于指定数组元素的数据类型。 在 NumPy 中,直接使用 Python 列表即可创建 ndarray 对象,无需使用 list() 函数。 dtype 属性正确地表示了数组中元素的数据类型,所以描述没有错误。实际上&#xff0c…

【Hadoop学习笔记】认识Hadoop

认识Hadoop 从网上找的课程做的笔记,有些图是自己理解画的,可能不正确,可以作为参考,有疑问的地方请直接指出,共同交流。 Hadoop是由Apache基金会开发的一个分布式系统基础架构,主要解决海量数据的存储和海…

安装mmdetection

python版本:3.7 torch1.10.0,torchvision0.11.0 torchaudio0.10.0 cudatoolkit11.3.1 mmdetection版本:2.11.0 mmcv-full: 根据自己的cuda版本和torch版本修改下面的网址,找到对应的下载并安装 https://download.openmmlab.com/mmcv/dist/cu113/torch1.…

Django ModelForm:循环展示所有字段

在Django开发中,使用ModelForm可以大大简化表单的创建和处理过程。本文将介绍如何使用ModelForm,并展示一种简洁的方法来循环显示表单中的所有字段。 1. 模型定义 首先,让我们看一下我们的模型定义: # models.py from django.db import modelsclass Classxxxx(models.Mo…

C++轻量级 线程间异步消息架构(向曾经工作的ROSA-RB以及共事的DOPRA的老兄弟们致敬)

1 啰嗦一番背景 这么多年,换着槽位做牛做马,没有什么钱途 手艺仍然很潮,唯有对于第一线的码农工作,孜孜不倦,其实没有啥进步,就是在不断地重复,刷熟练度,和同期的老兄弟们&#xf…

[OtterCTF 2018]Recovery

里克必须找回他的文件!用于加密文件的随机密码是什么 恢复他的文件 ,感染的文件 ? vmware-tray.ex 前面导出的3720.dmp 查找一下 搜索主机 strings -e l 3720.dmp | grep “WIN-LO6FAF3DTFE” 主机名 后面跟着一串 代码 aDOBofVYUNVnmp7 是不…

快速应用开发(RAD):加速软件开发的关键方法

目录 前言1. 快速应用开发的概念1.1 什么是快速应用开发?1.2 RAD与传统开发方法的对比 2. 快速应用开发的实施步骤2.1 需求分析与规划2.2 快速原型开发2.3 用户评估与反馈2.4 迭代开发与改进2.5 最终交付与维护 3. 快速应用开发的优点与应用场景3.1 优点3.2 应用场景…

微调Llama2自我认知

一、概述 最近在学习了解大模型微调相关的内容,在学习的过程中也遇到了很多问题,所以将自己的学习过程记录下来,希望对大模型微调感兴趣的小伙伴提供一点帮助,本文主要介绍一下如何通过SFT微调Llama2的自我认知,先看一…

Summaries

摘要是网格项,它利用聚合函数来显示有关所显示数据的摘要信息:总记录计数、最小值等。 GridControl-Grid View Summary Types 汇总 汇总总数(GridSummaryItem)是根据所有数据网格记录计算的,并显示在视图页脚中。启…

学懂C#编程:常用高级技术——学会泛型与集合(一)

C# 中的泛型和集合是两个非常重要的概念,它们极大地增强了代码的灵活性和可重用性。下面我将详细讲解这两个概念。 一、泛型 (Generics) 泛型允许你在定义类、接口、方法或委托时使用类型参数,从而使这些类型或方法可以在不指定具体类型的情况下…

【ACM出版-EI稳检索】第三届金融创新、金融科技与信息技术国际学术会议(FFIT 2024,7月26-28)

第三届金融创新、科技与信息技术国际学术会议(FFIT 2024)将于2024年07月26-28日于重庆举行。 FFIT2024 将围绕“金融创新”、"金融科技”与“信息技术”等相关最新研究领域,为来自国内外高等院校、科学研究所、企事业单位的专家、教授、…

第三阶段Spark

Spark和PySpark的介绍 PySpark的相关设置 安装PySpark库 pip install pyspark pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark 构建PySpark执行环境入口对象 # 导包 from pyspark import SparkConf, SparkContext# 创建SparkConf类对象 conf SparkConf()…

【代码随想录算法训练营第五十三天|739.每日温度、496.下一个更大元素I、503.下一个更大元素II】

文章目录 739.每日温度496.下一个更大元素I503.下一个更大元素II 739.每日温度 在这里单调栈相当于是在遍历数组的同时记录下了额外的大小关系的信息。因为这里需要的是每个数组元素右边第一个比他大的元素的间隔,因此单调栈是用来在遍历数组的时候存放还没有找到比…

算法题--华为od机试考试(整数对最小和、素数之积、找城市)

目录 整数对最小和 题目描述 注意 输出描述 示例1 输入 输出 说明 解析 答案 素数之积 题目描述 输入描述 输出描述 示例1 输入 输出 说明 示例2 输入 输出 说明 解析 找城市 题目描述 输入 输出 示例1 输入 输出 示例2 输入 输出 说明 解析…

PyTorch学习之torch.nn.functional.conv2d函数

PyTorch学习之torch.nn.functional.conv2d函数 一、简介 torch.nn.functional.conv2d 是 PyTorch 中用于进行二维卷积操作的函数。卷积操作是深度学习中卷积神经网络(CNN)的核心部分,用于提取图像特征,常见于图像分类、目标检测和…

Nvidia显卡GeForce Experience录屏操作流程

安装软件 首先我们从英伟达官网下载GeForce Experience程序,安装在电脑中GeForce Experience(简称 GFE)自动更新驱动并优化游戏设置 | NVIDIA 登录软件 安装完成后登录 开启录屏功能 登录后点击右上角的设置(小齿轮图标&#x…

MT1595 点到矩形

题目 用下面的数据类型分别表示点和矩形: struct POINT { //点 int x, y; //坐标值x和y } ; struct RECT { //矩形 POINT lt, rb; //矩形的左上角和右下角 } ; 输入矩形两个点的坐标值x和y,再输入第3个点的坐标,计算第3个点距这个矩形的最近…