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

MySQL是如何加行级锁的

SQL 代码 : 仓库链接

MySQL 的锁

MySQL 的锁按照加锁范围可以分为 全局锁 表级锁 和 行级锁。

行级锁是 innodb 存储引擎才支持的;

一般加行级锁前也会给表加上 意向锁,意向共享锁或者意向独占锁;

通过 select * from performance_schema.data_locks

可以查看当前数据库加了哪些锁, 比如:

行级锁的类型主要有三类

加锁的对象是索引 基本单位是 临键锁。

Record Lock,记录锁,也就是把一条记录锁上;

Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身;

Next-Key Lock: Record Lock+ Gap Lock的组合,锁定一个范围,并且锁定记录本身。

实战

总结

建表,插入数据

其中 id 为唯一索引, age 为非唯一索引。

CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,`age` int NOT NULL,PRIMARY KEY (`id`),KEY `index_age` (`age`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;INSERT INTO `user` VALUES (1, 'A', 10);
INSERT INTO `user` VALUES (2, 'B', 14);
INSERT INTO `user` VALUES (3, 'C', 17);
INSERT INTO `user` VALUES (4, 'D', 29);
INSERT INTO `user` VALUES (5, 'E', 35);
INSERT INTO `user` VALUES (15, 'F', 40);## 查看隔离级别  为 可重复读
SELECT @@global.transaction_isolation;SELECT @@transaction_isolation;
# REPEATABLE-READ

唯一索引等值查询

主键索引等值查询 (where id = xxx)

记录存在就是记录锁,不存在就是间隙锁,就可以 避免幻读,具体的:

如果查询记录存在,那么就不会加临键锁 而是会变为记录锁。

如果记录不存在 那么就在找到 第一条大于该查询记录的记录 后 ,将记录中的 临键锁 变为 间隙锁。因为记录本身不存在 ,也没有办法上记录锁。

锁住之后,其他事务想要 更改或者增加一条查询记录,都无法成功,只有等到 当前事务结束释放锁后才能成功。

记录存在

# 锁定读 记录存在 主键索引加记录锁  表加意向独占锁  防止幻读:
begin;
SELECT * FROM user WHERE id = 1 FOR UPDATE;commit ;
# 查询 当前的加锁情况  结果如下:
select * from performance_schema.data_locks;

记录不存在 但没有超过主键最大值

# 锁定读 记录不存在 主键索引加间隙锁  表加意向独占锁  防止幻读:
begin;
SELECT * FROM user WHERE id = 10 FOR UPDATE;commit ;
# 查询 当前的加锁情况
select * from performance_schema.data_locks;

记录不存在 但超过主键最大值

# 锁定读 记录不存在且超过了主键最大值  主键索引加临键锁  表加意向独占锁 :
begin;
SELECT * FROM user WHERE id = 100 FOR UPDATE;commit ;
# 查询 当前的加锁情况
select * from performance_schema.data_locks;

在MySQL InnoDB存储引擎中,supremum pseudo-record 是一个特殊的存在,通常被描述为 “正无穷大” ,用于表述索引记录中最大值之后的间隙。在 next-key lock 的机制中,supremum pseudo-record 用于锁定索引中最大值之后的范围。它并不是一个真实的索引记录,而是代表索引中可能存在的最大值,设置在 supremum pseudo-record 上的 next-key lock 锁定了“此索引中可能存在的最大值”以及这个值前面的间隙

非唯一索引查询

二级索引 等值查询(where age = xxx)

记录存在


# 锁定读  记录存在   age 加临键锁 以及 间隙锁  主键索引加记录锁  表加意向独占锁:
begin;
SELECT * FROM user WHERE age = 14 FOR UPDATE;commit ;select * from performance_schema.data_locks;

记录不存在 但没有超过 age 最大值

# 锁定读  记录不存在 非唯一索引 age索引 加间隙锁 表加意向独占锁:
begin;
SELECT * FROM user WHERE age = 25 FOR UPDATE;commit ;select * from performance_schema.data_locks;

记录不存在 但超过 age 最大值

# 锁定读  记录不存在 且大于age 最大值  非唯一索引 age索引 加临键锁  表加意向独占锁:
begin;
SELECT * FROM user WHERE age = 99 FOR UPDATE;commit ;select * from performance_schema.data_locks;

唯一索引范围查询 待续…

http://www.xdnf.cn/news/5616.html

相关文章:

  • Java大师成长计划之第19天:性能调优与GC原理
  • C# 中 static的使用
  • 计算机网络核心技术解析:从基础架构到应用实践
  • 2025年阿里云大数据ACP高级工程师认证模拟试题(附答案解析)
  • 基于Vue3.0的高德地图api教程004:自定义绘制点的颜色/修改绘制点/删除绘制点
  • RCE联系
  • 什么是ERP?ERP有哪些功能?小微企业ERP系统源码,SpringBoot+Vue+ElementUI+UniAPP
  • 基于LVS和Keepalived实现高可用负载均衡架构
  • [Java实战]Spring Boot 整合 Redis(十八)
  • Browserless 快速上手
  • FFmpeg 与 C++ 构建音视频处理全链路实战(一)—— 环境配置与视频解封装
  • ctfshow——web入门351~356
  • 【Pandas】pandas DataFrame cummax
  • web 自动化之 selenium 下拉鼠标键盘文件上传
  • FreeRTOS学习记录(变量命名规则全解、文件介绍)
  • 制造业IT管理方法论:柔性变更与数据治理的融合实践
  • 视觉-语言-动作模型:概念、进展、应用与挑战(上)
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
  • ActiveMQ 高级特性:延迟消息与优先级队列实战(一)
  • 【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器
  • 15.three官方示例+编辑器+AI快速学习webgl_buffergeometry_instancing
  • PINN应用案例:神经网络求解热扩散方程高质量近似解
  • Python的安装使用
  • 深度策略梯度算法PPO
  • 《Asp.net Mvc 网站开发》复习试题
  • Java SpringMVC 异常处理:保障应用健壮性的关键策略
  • Spring Bean有哪几种配置方式?
  • 计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 09.天空和背景
  • 鸿蒙(HarmonyOS)应用开发入门教程
  • ISSCC 25 14.4 性能达51.6TFLOPs/W的全数据路径存内计算宏单元,逼近稀疏性极限,应用于复合人工智能时损失低于2-30