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 的语言模型在需要叙事理解的各种任务上取得了令人难以置信的成功,包括…

【Hadoop学习笔记】认识Hadoop

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

[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)是根据所有数据网格记录计算的,并显示在视图页脚中。启…

【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()…

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

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

Nvidia显卡GeForce Experience录屏操作流程

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

隐藏Python运行产生的缓存文件(__pycache__)

不少同学使用VScode 提交或运行python代码的时候,出现一些缓存文件 类似于(__pycache__) 这种,对于我这种有一丢丢强迫症的人来说,运行一次就得删除一次,那有没有什么办法将其隐藏的? 在vscode编辑器中打开设置&#…

HarmonyOS Next开发学习手册——创建轮播 (Swiper)

Swiper 组件提供滑动轮播显示的能力。Swiper本身是一个容器组件,当设置了多个子组件后,可以对这些子组件进行轮播显示。通常,在一些应用首页显示推荐的内容时,需要用到轮播显示的能力。 针对复杂页面场景,可以使用 Sw…

第2章_开发板使用

文章目录 第2章 开发板使用2.1 硬件连接2.1.1 连接 ST-Link2.1.2 连接 USB 串口2.1.3 连接 SPI 屏 2.2 运行测试程序验证硬件2.2.1 硬件接线(RS485、CAN)2.2.2 编译工程2.2.3 配置调试器2.2.4 烧录运行 2.3 创建第 1 个工程2.3.1 创建工程2.3.2 选择调试…

动态规划基础练习

我们需要先从数组较大的开始进行处理&#xff0c;每次考察上下左右的&#xff0c;比较当前存储的最大值和转移来的值&#xff0c;哪一个大一点 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std;int n, m; int a[105][105]; int addx[] { 0,…

pandas合并,拆分excel

目录 一:按照列进行拆分 二:将某几列的数据写入新excel 三:合并两个sheet数据到一个excel的一个sheet中 我们以商品销售明细为例,说明下excel的数据拆分和合并,我们的原始数据如下: 一:按照列进行拆分 现在我们需要统计下是否配送和支付方式为维度进行分组以后得数据…

成品视频素材下载网站有哪些?剪辑好可以用的视频素材网站分享

对于初学者在制作短视频时&#xff0c;常常希望能够快速获取高质量的素材。如果你正计划从事短视频创作&#xff0c;这里推荐几个优秀的成品素材网站&#xff0c;希望能对你有所帮助。 首先推荐的是蛙学网 作为国内用户首选的成品视频素材平台之一。这里提供丰富的视频素材库&…

SM2258XT量产工具,SM2258XT开卡三星SSV4颗粒成功分享,SM2259XT量产参考教程,威刚ADATA SP580开卡记录

前两天拆了笔记本上的威刚ADATA SP580 240GB&#xff0c;准备做移动硬盘用&#xff0c;装入移动硬盘盒之后接入电脑&#xff0c;发现系统可认盘&#xff0c;SMART显示正常&#xff0c;Windows的磁盘管理能显示正确容量&#xff0c;但处于未初始化状态&#xff0c;且始终无法初始…

装载问题(回溯法)

#include<iostream> using namespace std; int n;//货物的数量 int c;//轮船的总的载重量 int cw;//轮船当前的载重量 int r;//货物的总重量 int w[1000];//n个货物各自的重量 int x[1000];//当前最优解 int bestx[1000];//最优解 int bestw;//货物的最优载重量 void Bac…