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

MySQL间隙锁在查询时锁定的范围

文章目录

  • 基础环境设置
  • 一、等值查询的间隙锁
    • 1.1 查询不存在的值
    • 1.2 查询存在的值
  • 二、范围查询的间隙锁
    • 2.1 闭区间范围查询
    • 2.2 开区间范围查询
    • 2.3 单边界范围查询
  • 三、特殊情况的间隙锁
    • 3.1 空表的间隙锁
    • 3.2 只有一条记录的表
  • 四、锁定范围的边界规则总结

基础环境设置

CREATE TABLE test_gap (id INT PRIMARY KEY,value INT,name VARCHAR(50),INDEX idx_value (value)
) ENGINE=InnoDB;INSERT INTO test_gap VALUES
(1, 10, 'A'),
(3, 20, 'B'), 
(5, 30, 'C'),
(7, 40, 'D'),
(9, 50, 'E');

一、等值查询的间隙锁

1.1 查询不存在的值

查询SQL锁定范围说明
SELECT * FROM test_gap WHERE value = 15 FOR UPDATE;(10, 20)15位于10和20之间
SELECT * FROM test_gap WHERE value = 25 FOR UPDATE;(20, 30)25位于20和30之间
SELECT * FROM test_gap WHERE value = 5 FOR UPDATE;(-∞, 10)5小于最小值10
SELECT * FROM test_gap WHERE value = 60 FOR UPDATE;(50, +∞)60大于最大值50

1.2 查询存在的值

查询SQL锁类型说明
SELECT * FROM test_gap WHERE value = 20 FOR UPDATE;临键锁记录锁+前后间隙锁
SELECT * FROM test_gap WHERE id = 3 FOR UPDATE;记录锁主键查询,无间隙锁

二、范围查询的间隙锁

2.1 闭区间范围查询

查询SQL具体锁定区间
WHERE value >= 20 AND value <= 40(10, 20] + (20, 30] + (30, 40] + (40, 50)
WHERE value >= 15 AND value <= 35(10, 20] + (20, 30] + (30, 40)
WHERE value >= 25 AND value <= 45(20, 30] + (30, 40] + (40, 50)

2.2 开区间范围查询

查询SQL具体锁定区间
WHERE value > 20 AND value < 40(20, 30] + (30, 40)
WHERE value > 15 AND value < 35(10, 20] + (20, 30] + (30, 40)
WHERE value > 25 AND value < 45(20, 30] + (30, 40] + (40, 50)

2.3 单边界范围查询

查询SQL锁定范围
WHERE value >= 30(20, 30] + (30, 40] + (40, 50] + (50, +∞)
WHERE value > 30(30, 40] + (40, 50] + (50, +∞)
WHERE value <= 30(-∞, 10] + (10, 20] + (20, 30] + (30, 40)
WHERE value < 30(-∞, 10] + (10, 20] + (20, 30)

三、特殊情况的间隙锁

3.1 空表的间隙锁

查询SQL锁定范围说明
SELECT * FROM empty_table WHERE value = 100 FOR UPDATE;(-∞, +∞)整个值域间隙
SELECT * FROM empty_table WHERE value > 50 FOR UPDATE;(-∞, +∞)整个值域间隙

3.2 只有一条记录的表

-- 假设只有一条记录:value = 100
查询SQL锁定范围说明
WHERE value = 50(-∞, 100)50不存在,锁定前间隙
WHERE value = 150(100, +∞)150不存在,锁定后间隙
WHERE value = 100(-∞, 100] + (100, +∞)存在,临键锁覆盖所有间隙

四、锁定范围的边界规则总结

规则说明示例
记录存在加临键锁 = 记录锁 + 间隙锁value=20(10,20] + (20,30)
记录不存在只加间隙锁value=25(20,30)
范围查询锁定所有可能插入影响结果的间隙value>20(20,30] + (30,40] + ...
边界保护查询边界外也要锁定相邻间隙20≤value≤40 → 还要锁(40,50)
http://www.lryc.cn/news/611401.html

相关文章:

  • MinIO02-Docker安装
  • AI编程新时代:从氛围编程到上下文编程的深度实践和思考
  • GPS信号捕获尝试(上)
  • 快接龙 | 要如何对用户的接龙频次进行系统硬控
  • MongoDB 从3.4.0升级到4.0.0完整指南实战-优雅草蜻蜓I即时通讯水银版成功升级-卓伊凡|bigniu
  • 【文本左右对齐】
  • 【web自动化测试】实战
  • Python基础框架
  • WebRTC音视频编码模块深度解析:从编解码器到自适应码率控制(2025技术实践)
  • 前端包管理器深度对比
  • 普通树状数组
  • 贪心算法学习 1
  • Zabbix 企业级高级应用
  • 风丘助力混合动力汽车工况测试:精准采集整车信号解决方案
  • VNC连接VirtualBox中的Ubuntu24.04 desktop图形化(GUI)界面
  • 2025年渗透测试面试题总结-01(题目+回答)
  • GitHub Models:为开源AI项目解决推理难题,让AI更易用、更普及
  • css初学者第三天
  • MySQL 如何优化慢查询
  • Redis中的sdshdr的len和alloc那块的知识点详解
  • 前端记录项目中用到的js
  • python可视化--Seaborn图形绘制方法和技巧,Bokeh图形绘制方法和技巧
  • 最新基于Python科研数据可视化实践技术
  • 磁悬浮转子振动控制:主动电磁力如何成为高速旋转的“振动克星”
  • css动态样式
  • 【Git学习】入门与基础
  • Cisco 3750X交换机更新到IOS 15.2后无法启动 提示:Boot process failed...
  • Laravel The requested URL /hellowzy was not found on this server. 404 问题的解决
  • 嵌入式 - 数据结构:循环链表和内核链表
  • ES 模块动态导入