mysql间隙锁详解
时间: 2025-02-19 08:31:38 AIGC 浏览: 143
### MySQL 中间隙锁的工作原理
#### 什么是间隙锁?
在MySQL的InnoDB存储引擎中,Gap Lock(间隙锁)是一种特殊的锁定方式[^3]。它不仅锁定索引记录本身,还会锁定两个索引记录之间的“间隔”。这种设计可以有效阻止幻读现象的发生。
#### 间隙锁的作用范围
当数据库执行插入或更新操作时,在某些情况下会自动施加间隙锁以确保数据的一致性和完整性。具体来说:
- **防止幻影行**:如果当前查询条件匹配不到任何现有记录,则会对符合条件的位置加上间隙锁;
- **维护外键关系**:在外键检查期间也会涉及到间隙锁的应用场景,比如避免父表中的某条记录被删除而影响子表中外键约束的有效性[^2];
#### 加锁时机与模式转换
对于非唯一索引列上的范围查询语句,InnoDB通常会在扫描过程中对遇到的第一个不满足WHERE条件之前的边界位置设置Next-Key Lock (即Record+Gap),直到最后一个满足条件之后紧接着的一个gap为止。而在处理UPDATE/DELETE命令时则更加严格——除了上述提到的情况之外,还可能针对整个区间实施全量级封锁。
```sql
SELECT * FROM t WHERE id BETWEEN 10 AND 20 FOR UPDATE;
```
此SQL语句将会对id等于9和21这两个不存在于表内的虚拟值之间形成一个连续区域进行锁定,从而保障在此范围内不会出现新的竞争写入行为。
#### 锁定冲突示例
假设有一个简单的商品库存管理表格`products`,其中包含字段`product_id`作为主键以及`quantity`表示数量。现在有两个并发事务T1和T2分别尝试向该表内新增两条具有相同`product_id`的新纪录:
| product_id | quantity |
|------------|----------|
| 100 | 50 |
此时如果没有启用间隙锁机制的话,就可能发生竞态条件导致重复插入同样的产品编号。但是由于存在间隙锁的存在,第二个试图提交更改的操作会被阻塞直至第一个完成其事务流程后再继续执行下去。
阅读全文
相关推荐
















