当前位置: 首页 > article >正文

Mysql是怎么加锁的?

原文地址https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E4%BB%80%E4%B9%88-sql-%E8%AF%AD%E5%8F%A5%E4%BC%9A%E5%8A%A0%E8%A1%8C%E7%BA%A7%E9%94%81我只是精简一下做个记录这篇汇总将基于MySQL 8.0 的 InnoDB 引擎在可重复读Repeatable Read, RR隔离级别下进行深度的全场景拆解。核心底座加锁准则原则加锁的基本单位是Next-Key Lock临键锁区间是 (前一个记录, 当前记录]。退化为了提高并发MySQL 会在确保“不产生幻读”的前提下将临键锁降级为Record Lock记录锁或Gap Lock间隙锁。查找索引查找过程中扫描到哪里锁就加到哪里。准备环境表user主键 id普通索引 age无索引字段 name。数据1,10 5,20 10,30 15,40 20,50一、 唯一索引主键加锁逻辑1. 等值查询记录存在如 id5锁记录锁 id5。原因唯一性保证了不可能有第二个 id5 插入只需锁住这一行不需要锁间隙最极致的退化。记录不存在如 id7锁间隙锁 (5, 10)。原因锁是加在索引上的既然 7 这条记录不存在没法直接锁行。扫描到 10 时发现大于 7为了防止别人插入 7只能把 5~10 之间的“物理空地”锁住。放过 10 是因为 10 本身与 7 无关。2. 范围查询、、、id 5锁(5, 10]、(10, 15]、(15, 20]、(20, supremum]。注supremum是无穷大伪记录原因所有的 Next-Key Lock 都不降级确保整个范围及后续间隙无法插入。id 5锁记录锁 id5 5 10]10 15] ...原因id5 是等值匹配且唯一所以 5 这一处精准降级为记录锁后面的维持临键锁。id 15锁-∞ 1]、1 5]、5 10]、间隙锁 10 15。注意MySQL 扫描到 15 时发现不满足 15于是最后的临键锁 (10, 15]退化为间隙锁 (10, 15)。既防止了 15 之前的间隙被插入又释放了对 15 本身的锁定。id 15锁-∞ 1]、1 5]、5 10]10 15]。原因因为 15 在查询范围内必须被锁住同时为了防止 10~15 之间的间隙被插入数据必须保持完整的临键锁不发生降级二、 非唯一索引普通索引加锁逻辑这是最容易搞混的地方因为它需要同时保护二级索引树和主键聚簇索引树。1. 等值查询记录存在如 age20锁age 索引上加 (10, 20] 的临键锁并且额外加 (20, 30) 的间隙锁。为什么非唯一索引必须把 20 左右两边的物理过道都封死否则别人可以插入一个新的 age20只要主键不同即可导致幻读。回表对应的 id5 主键索引上会加一个记录锁。记录不存在如 age25锁age 索引上加 (20, 30) 间隙锁。原因退化逻辑与唯一索引未命中时一致只需守住这块无人区。2. 范围查询、、、年龄 20锁age 索引上 20 30]、30 40]、40 50]、50 supremum]。规则非唯一索引的范围查询保护极严全是 Next-Key Lock基本不降级。年龄 20锁age 索引上 10 20]20 30] ...区别即使是等值部分非唯一索引也不会像主键那样降级为记录锁因为 20 前面的间隙也得守住防止插队。三、 各种符号的“退化”总结表 (修正版)场景索引类型匹配结果最终锁范围备注等值 ()唯一存在记录锁最极致的性能降级精准打击等值 ()唯一不存在间隙锁退化仅锁住目标所在的真空地带等值 ()非唯一存在Next-Key 随后的 Gap双重保护前后过道全部封死范围 ()唯一包含边界边界记录锁 后续 Next-Key起点等于精确查找起点降级范围 ()唯一-全程 Next-Key不降级范围 ()唯一不含边界前置 Next-Key 最后的 Gap扫到第一个不符合条件的边界边界退化为间隙锁范围 ()唯一包含边界全程 Next-Key因为要锁住边界又要保护间隙不降级所有范围非唯一-全程 Next-Key保护极严绝不降级四、 没加索引的查询全表封杀SQL更新用户设置年龄100 其中 name 张三;过程InnoDB 发现 name 没索引只能走聚簇索引主键进行全表扫描。扫描时每一行记录都会被加上Next-Key Lock。结果是-∞ 1]、1 5]、5 10] ...直到 ∞ supremum]。后果这意味着整张表无论是修改已有行还是插入新行全被锁死这就是俗称的“锁表”。补充注意MySQL 内部有优化在某些版本中如果扫描后发现不匹配会提前释放掉不符合条件的锁。但在高并发瞬间全表扫描依然可能导致大规模锁等待或死锁。五、 终极恍然大悟为啥要这么变为啥唯一索引等值存在就降级记录锁因为主键 ID 是唯一的只要我锁住了 ID5 这一行全世界都不可能再产生第二个 ID5。所以我不需要管 (1, 5) 的间隙。为啥非唯一索引等值还要加间隙锁因为你有 age20我再插一个 age20主键设为 99是可以成功的。如果不锁间隙你第二次查 age20 就会多出一行这就是“幻读”。为啥范围查询很少降级范围查询的目标通常是保护“一片领土”。如果你查 id 5哪怕 5 后面的 6, 7, 8 现在不存在我也得防着你所以必须把后面所有的间隙全焊死。 一句话总结能降级退化的前提是——即使我放开了间隙你也绝对无法在我的眼皮底下插进一行符合我查询条件的“幻影”数据。如果不能保证这一点MySQL 就会死死握住 Next-Key Lock 不撒手。

相关文章:

Mysql是怎么加锁的?

原文地址https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E4%BB%80%E4%B9%88-sql-%E8%AF%AD%E5%8F%A5%E4%BC%9A%E5%8A%A0%E8%A1%8C%E7%BA%A7%E9%94%81 我只是精简一下做个记录 这篇汇总将基于 MySQL 8.0 的 InnoDB 引擎,在 可重复读(Repe…...

LeetCode 153. 旋转排序数组找最小值:二分最优思路

LeetCode中等难度的经典题目——153. 寻找旋转排序数组中的最小值。这道题的核心考点是「二分查找」,难点在于如何利用“旋转排序数组”的特性,在O(log n)时间复杂度内找到最小值,也是面试中常考的二分变形题。 一、题目解读:读懂…...

uniapp中如何用lottie-miniprogram加载json动画?5分钟搞定炫酷效果

Uniapp中5分钟集成Lottie动画:从原理到实战的完整指南 在移动应用开发中,精美的动画效果往往能显著提升用户体验。对于Uniapp开发者来说,Lottie-miniprogram提供了一种高效的方式,可以直接加载设计师导出的JSON动画文件&#xff0…...

win11 WSL ubuntu24.04 安装两个、重命名

导出: wsl --export Ubuntu-24.04 D:\Ubuntu-24.04.tar导入新镜像: wsl --import Ubuntu-24.04-2 D:\Ubuntu-24.04-2\Ubuntu-24.04-2 D:\Ubuntu-24.04.tar...

手把手教你用RTABMAP+T265在Windows10上实现室内三维扫描(含标定技巧)

手把手教你用RTABMAPT265在Windows10上实现高精度室内三维扫描 第一次接触室内三维扫描时,我被这项技术深深吸引——它能让物理空间瞬间数字化,就像给现实世界按下"CtrlC"。但真正动手配置RTABMAP和T265相机时,才发现这条路并不平坦…...

OpenClaw多模型切换指南:Qwen3-32B与本地Llama混合调用

OpenClaw多模型切换指南:Qwen3-32B与本地Llama混合调用 1. 为什么需要多模型切换? 去年冬天,当我第一次尝试用OpenClaw自动处理周报时,发现一个有趣的现象:用同一个模型处理文本润色和代码生成任务,效果差…...

MAX17332 Arduino库详解:单节锂电池燃料计量与独立充电控制

1. 项目概述 MAX17332 是 Maxim Integrated(现为 Analog Devices)推出的一款高度集成的单节锂离子/锂聚合物电池管理芯片,专为紧凑型便携设备设计。它并非传统意义上的“纯BMS”(Battery Management System)&#xff0…...

计算机毕业设计:基于Django与LSTM的大众点评评价预测系统 Django框架 LSTM Hadoop Spark Hive 可视化 大数据 食品 食物(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

BlueROV2进阶:巧用ArduSub参数配置实现多舵机协同控制

1. 从单舵机到多舵机协同的跨越 第一次用Pixhawk控制单个舵机转动时的兴奋感还记忆犹新,但当真正开始构建BlueROV2这样的水下机器人时,你会发现单一舵机控制远远不够。想象一下这样的场景:机械爪需要精准开合,云台要平稳转动&…...

告别论文 ddl 焦虑!PaperZZ AI:本科毕业论文从 0 到 1 的极速生成攻略[特殊字符]

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿/期刊论文paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 还在为本科毕业论文熬大夜?选题没思路、文献找不到、大纲搭不起来、初稿写不出…… 无数…...

FastAPI流式AI接口设计陷阱大全(2024高频真题+源码级调试实录)

第一章:FastAPI流式AI接口设计陷阱大全(2024高频真题源码级调试实录)流式响应被中间件静默截断 FastAPI 默认启用的 Starlette 中间件(如 HTTPSRedirectMiddleware 或自定义日志中间件)可能在未显式处理 StreamingResp…...

【FastAPI 2.0流式AI响应核心机密】:3大异步协程调度陷阱、2处EventSource底层劫持点、1个未公开的StreamingResponse状态机设计缺陷

第一章:FastAPI 2.0流式AI响应的架构演进与设计哲学FastAPI 2.0 将流式响应能力从实验性支持提升为核心原语,其底层重构了 Starlette 的响应生命周期与事件循环集成机制,使 Server-Sent Events(SSE)、text/event-strea…...

遥感影像配准总对不齐?OpenCV+RST+PROJ4三重坐标系对齐实战(附WGS84→UTM→影像本地坐标的转换矩阵速查表)

第一章:Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统自动化任务的核心工具,以可执行文本文件形式存在,由Bash等shell解释器逐行解析运行。其语法简洁但严谨,对空格、分号、引号和换行符敏感,需严格遵循语法规则…...

OpenClaw隐私方案:nanobot镜像本地化部署与敏感数据处理实践

OpenClaw隐私方案:nanobot镜像本地化部署与敏感数据处理实践 1. 为什么需要本地化部署的AI助手? 去年在处理一份涉及客户隐私的法律文件时,我遇到了一个两难选择:要么手动逐条整理数百页文档,要么使用云端AI工具但面…...

开源 AI 应用平台实战部署:从零搭建到插件调试避坑指南

1. 开源AI平台部署前的环境准备 在开始部署Dify和AIFlowy之前,环境准备是至关重要的一步。我遇到过不少开发者因为基础环境没配好,导致后续步骤频繁报错的情况。这里分享下Windows和Linux双平台下的实战经验。 对于Dify平台,你需要准备Python…...

智能家居控制中心:OpenClaw+Qwen3.5-9B语音指令中转

智能家居控制中心:OpenClawQwen3.5-9B语音指令中转 1. 为什么需要语音控制的智能家居中枢? 去年装修新房时,我装了十几款不同品牌的智能设备——从米家的灯泡到涂鸦的窗帘电机,再到HomeKit的温控器。每次想调整家居状态&#xf…...

从安装到跑通第一个旋转立方体:Ubuntu 22.04 + OpenGL完整开发环境搭建实录

从零到旋转立方体:Ubuntu 22.04下OpenGL开发环境实战指南 刚接触图形编程时,最令人兴奋的莫过于看到自己编写的代码在屏幕上"活"起来。本文将带你从零开始,在Ubuntu 22.04系统上搭建完整的OpenGL开发环境,并最终实现一个…...

OpenClaw负载测试:GLM-4.7-Flash并发处理能力评估

OpenClaw负载测试:GLM-4.7-Flash并发处理能力评估 1. 测试背景与目标 上周在尝试用OpenClaw自动化处理一批市场调研报告时,遇到了一个典型问题:当我同时提交20份PDF文件让AI助手提取关键数据时,系统开始出现响应延迟和部分任务超…...

MySQL 事务机制深度解析:从 ACID 到底层实现

MySQL 事务机制深度解析:从 ACID 到底层实现 MySQL 的事务机制主要由 InnoDB 存储引擎 实现,核心围绕 ACID 四大特性,通过 日志系统(redo log、undo log)、锁机制 和 MVCC(多版本并发控制) 共同…...

RRT*在ROS中的实战:用Gazebo仿真实现动态避障(Python+ROS Noetic)

RRT*在ROS中的实战:用Gazebo仿真实现动态避障(PythonROS Noetic) 路径规划是机器人自主导航的核心技术之一。在复杂动态环境中,如何快速找到一条安全且优化的路径一直是研究热点。RRT*(Rapidly-exploring Random Trees…...

小型电商自动化:OpenClaw+nanobot处理订单邮件

小型电商自动化:OpenClawnanobot处理订单邮件 1. 为什么选择OpenClaw处理电商订单 作为一个经营小型电商的个体商户,我每天要处理几十封来自Gmail的订单邮件。这些邮件包含客户信息、商品清单和收货地址,需要手动录入到库存表格、生成物流单…...

ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案

ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI ncmdumpGUI是一款开源的音频格式转换工具&am…...

单片机开发三大软件架构对比与实践

单片机开发常用软件架构深度解析1. 项目概述在嵌入式系统开发中,软件架构设计直接影响系统的可靠性、可维护性和实时性。本文系统分析三种主流单片机软件架构方案,包括时间片轮询法、操作系统方案和前后台顺序执行法,为开发者提供架构选型参考…...

el-tabs报错Cannot read properties of null (reading ‘insertBefore‘)

使用elementui-plus的tabs组件在开发中遇到的一个问题,分析了代码,发现逻辑没有任何问题,但是点击tab切换就会报错:Uncaught (in promise) TypeError: Cannot read properties of null (reading insertBefore)调试发现parent参数是…...

【Python时序预测实战】基于贝叶斯优化的Transformer单变量时序预测模型构建与调优

1. 为什么选择Transformer做时序预测? 我第一次用Transformer做销量预测时,心里其实挺没底的。毕竟这玩意儿原本是搞自然语言处理的,就像拿菜刀削苹果——工具不太对口。但当我看到预测结果比传统LSTM提升了23%的准确率时,立刻真香…...

别再只仿真了!手把手教你用LabVIEW+USRP-2920搭建真实无线通信链路(BPSK/QPSK调制实战)

从仿真到实战:LabVIEW与USRP-2920构建无线通信链路的完整指南 在通信工程领域,仿真与硬件实现之间往往存在一道难以逾越的鸿沟。许多工程师能够熟练使用MATLAB或LabVIEW进行通信系统仿真,但当面对USRP-2920这样的射频硬件时,却常常…...

如何用ASR6601实现22dBm发射功率?LoRa模组射频优化全流程

ASR6601射频性能深度优化:从原理到22dBm发射功率实战指南 在低功耗广域物联网(LPWAN)领域,LoRa技术凭借其出色的传输距离和抗干扰能力,已成为智慧城市、工业监测等场景的首选方案。而ASR6601作为国产化LoRa SoC的佼佼者,其集成的A…...

Vue3 的 JSX 函数组件,每次更新都会重新运行吗?

我用最直白、最无歧义、100%准确的方式,只回答你这一个问题: ✅ 最终答案(背它) 在 Vue3 中: 你写的 JSX 函数组件,整个函数 只会在组件初始化时运行 1 次! 更新时,整个函数 不会重新…...

Halcon一维码识别避坑指南:从模糊图像到精准解码

Halcon一维码识别实战:攻克模糊图像与复杂场景的五大策略 在物流分拣线上,传送带以每秒2米的速度运行,扫码枪却频繁报错——这不是设备故障,而是Halcon参数配置与图像预处理策略的缺失。当条形码出现在褶皱包装、反光表面或运动模…...

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右,可以进行历史频谱图和时域图回放,可以求的最大值并设置阈值报警可以导出报警最近在搞工业设备监控系统的时候,需要实时采集振动和温度数据…...