【mysql】锁机制 - 2.行锁间隙锁临键锁

MySQL 锁机制详解(行锁、间隙锁、临键锁)

行锁(Record Lock)

行锁是作用于索引记录上的锁,确保事务对某一行数据的独占访问。行锁分为共享锁(S锁)和排他锁(X锁):

  • 共享锁(S锁):允许其他事务读取被锁定的行,但禁止修改。
  • 排他锁(X锁):禁止其他事务读取或修改被锁定的行。

行锁的实现依赖索引,如果没有索引,InnoDB会隐式创建隐藏的聚簇索引来加锁。

间隙锁(Gap Lock)

间隙锁锁定的是索引记录之间的间隙,防止其他事务在间隙中插入数据,解决幻读问题。间隙锁仅在REPEATABLE READ隔离级别下生效。

间隙锁的特点:

  • 仅作用于非唯一索引或范围查询。
  • 间隙锁之间不互斥,允许不同事务在同一间隙上加锁。
  • 间隙锁会阻塞插入操作,但不影响其他事务在已有记录上加锁。

示例场景:

sql 复制代码
-- 事务A执行范围查询,对(5,10)间隙加锁
SELECT * FROM table WHERE id BETWEEN 5 AND 10 FOR UPDATE;

-- 事务B尝试在间隙中插入数据会被阻塞
INSERT INTO table (id) VALUES (7);
临键锁(Next-Key Lock)

临键锁是行锁与间隙锁的组合,锁定索引记录及其之前的间隙。它是InnoDB默认的行锁算法,结合了防止幻读和确保数据一致性的能力。

临键锁的规则:

  • 对于唯一索引的等值查询,退化为行锁。
  • 对于非唯一索引或范围查询,锁定匹配的行及相邻间隙。

示例:

sql 复制代码
-- 表中存在id=5和id=10的记录
-- 事务A锁定id=5的行及(5,10)间隙
SELECT * FROM table WHERE id = 5 FOR UPDATE;

-- 事务B无法插入id=6或修改id=5
INSERT INTO table (id) VALUES (6);
UPDATE table SET name='test' WHERE id=5;
锁的兼容性
锁类型 X(排他锁) S(共享锁) Gap(间隙锁)
X 冲突 冲突 冲突
S 冲突 兼容 兼容
Gap 冲突 兼容 兼容
优化建议
  • 尽量使用唯一索引减少锁范围。
  • 避免大事务,减少锁持有时间。
  • 合理选择隔离级别,READ COMMITTED可减少间隙锁的使用。
相关推荐
小白男神5 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶6 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G6 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备6 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远6 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19916 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218616 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客6 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren6 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安6 天前
MySQL-触发器
数据库·mysql