详解MySQL的间隙锁

MySQL 的间隙锁(Gap Lock)

间隙锁(Gap Lock)是 InnoDB 存储引擎中的一种锁机制,用于防止幻读现象。幻读是指在一个事务中,两次读取同一个范围的数据时,第二次读取出现了第一次没有出现的数据行。间隙锁通过锁定一个范围内的"间隙"来防止其他事务在该范围内插入新记录,从而避免幻读。

间隙锁的特性

锁定范围 :间隙锁锁定的是记录之间的间隙,而不是具体的记录。例如,如果表中有记录 1, 2, 4, 5,那么间隙锁可能锁定 (2, 4) 之间的间隙。

防止插入 :间隙锁可以防止其他事务在锁定的间隙范围内插入新记录。例如,如果间隙 (2, 4) 被锁定,则不能在 24 之间插入新的记录。

共享锁:间隙锁是共享锁,多个事务可以同时持有同一个间隙锁,但这些事务都不能在该间隙范围内插入新记录。

间隙锁的使用场景

间隙锁通常在以下场景中使用:

  1. 范围查询 :在执行范围查询时,例如 SELECT * FROM table WHERE column BETWEEN value1 AND value2 FOR UPDATE,InnoDB 会使用间隙锁来锁定查询范围内的间隙。
  2. 范围删除 :在执行范围删除时,例如 DELETE FROM table WHERE column BETWEEN value1 AND value2,InnoDB 也会使用间隙锁来锁定删除范围内的间隙。

示例

假设我们有一个表 employees,其中包含以下记录:

sql 复制代码
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

INSERT INTO employees (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (4, 'Charlie'), (5, 'David');

在一个事务中执行范围查询并加锁:

sql 复制代码
START TRANSACTION;
SELECT * FROM employees WHERE id BETWEEN 2 AND 4 FOR UPDATE;

此时,InnoDB 会锁定 (2, 4) 之间的间隙,防止其他事务在该范围内插入新记录。

在另一个事务中尝试插入新记录:

sql 复制代码
START TRANSACTION;
INSERT INTO employees (id, name) VALUES (3, 'Eve');

由于 (2, 4) 的间隙被锁定,第二个事务会被阻塞,直到第一个事务提交或回滚。

事务隔离级别与间隙锁

间隙锁在 MySQL 的 REPEATABLE READSERIALIZABLE 隔离级别下生效。在 READ COMMITTEDREAD UNCOMMITTED 隔离级别下,间隙锁通常不会被使用。

总结

间隙锁是 InnoDB 用于防止幻读的一种锁机制,通过锁定记录之间的间隙,防止其他事务在该范围内插入新记录。间隙锁在范围查询和范围删除操作中尤为重要,确保了事务的一致性和隔离性。在实际应用中,理解和正确使用间隙锁可以帮助开发者构建更加健壮和可靠的数据库应用。

相关推荐
找不到、了6 分钟前
MySQL的FEDERATED存储引擎详解
数据库·mysql
小希smallxi6 分钟前
Windows平台一键启动Redis脚本
数据库·windows·redis
写代码的小阿帆7 分钟前
MySQL索引原理与性能优化
数据库·mysql·性能优化
小蒜学长8 分钟前
python基于Python的医疗机构药品及耗材信息管理系统(代码+数据库+LW)
数据库·spring boot·后端·python
星光一影10 分钟前
同城搭子活动组局H5系统源码-伴伴搭子系统源码
vue.js·mysql·php·uniapp
千寻技术帮16 分钟前
10363_基于SSM的农机租赁管理系统
mysql·毕业设计·ssm·源码·农机租赁
xUxIAOrUIII29 分钟前
【数据库原理】期末复习(初稿)
数据库·笔记
Pocker_Spades_A29 分钟前
AI Ping 上线 GLM-4.7 与 MiniMax M2.1:两款国产旗舰模型免费用!
大数据·数据库·人工智能
峰顶听歌的鲸鱼39 分钟前
20.MySql数据库
运维·数据库·笔记·mysql·云计算·学习方法
G_H_S_3_41 分钟前
【网络运维】SQL 语言:MySQL数据库基础与管理
运维·网络·数据库·mysql