当前位置: 首页 > 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.xdnf.cn/news/1248553.html

相关文章:

  • 前端遇到页面卡顿问题,如何排查和解决?
  • 【运维部署篇】OpenShift:企业级容器应用平台全面解析
  • Spring 的优势
  • Springboot集成Log4j2+MDC串联单次请求的日志
  • HBM Basic(VCU128)
  • 《Python基础》第3期:使用PyCharm编写Hello World
  • Leetcode-2080区间内查询数字的频率
  • 查看部署在K8S服务的资源使用情况
  • LOOP Finance:一场 Web3 共和国中的金融制度实验
  • 创维智能融合终端DT741_移动版_S905L3芯片_安卓9_线刷固件包
  • Linux驱动24 --- RkMedia 视频 API 使用
  • 前端保持和服务器时间同步的方法【使用vue3举例】
  • Tasks and Deadlines(Sorting and Searching)
  • Mysql-事务
  • Nginx入门:高性能Web服务器详解
  • 【图像算法 - 09】基于深度学习的烟雾检测:从算法原理到工程实现,完整实战指南
  • Claude Code实战体验:AI智能编程助手如何重塑开发工作流?
  • 2. JS 有哪些数据类型
  • Linux的NFS与Autofs配置指南
  • nodejs 编程基础01-NPM包管理
  • 最优化中常见的优化理论
  • Shader开发(七)创建第一个Shader项目
  • 游戏画面总是卡顿怎么办 告别延迟畅玩游戏
  • DDoS 防护的未来趋势AI 如何改变安全行业
  • MySQL 5.7 和 8.0 离线安装教程(图文版适合电脑小白)
  • C++返回值优化(RVO):高效返回对象的艺术
  • 【基础】第八篇 Java 位运算符详解:从基础到实战应用
  • Unknown initial character set index ‘255’,Kettle连接MySQL数据库常见错误及解决方案大全
  • nuxt学习笔记
  • 什么是mysql的垂直分表,理论依据是什么,如何使用?