MySQL复合主键前缀下DELETE语句的锁范围与锁类型咨询
DELETE FROM T WHERE A=x LIMIT 100 的锁逻辑分析(InnoDB引擎)
锁的类型
- 实际被删除的100条记录会被加上排他锁(X锁):这是行级锁,确保其他事务无法对这些行执行读(加共享锁S)或写操作,保证删除操作的原子性和一致性。
- 表级别会添加意向排他锁(IX锁):这是一种表级标记锁,用来告诉其他事务“本事务正在表内某些行持有排他锁”,避免全表扫描的事务直接加表级S/X锁时产生冲突。
是否会锁定所有A=x的行?
不会。核心原因如下:
- LIMIT 100的终止逻辑:当InnoDB扫描到100条满足
A=x的记录后,会立刻停止扫描和加锁流程,不会继续处理剩余的99900条A=x的记录。 - 主键索引的扫描路径:因为主键是
[A,B,C],A=x匹配主键的前缀,InnoDB会沿着主键索引的有序结构,从第一个A=x的记录开始依次扫描、加锁,直到凑够100条符合条件的行,后续的A=x记录不会被加锁。
隔离级别的额外影响
- 可重复读(RR)隔离级别:扫描过程中,InnoDB可能会对扫描路径上的间隙添加间隙锁(Gap Lock),防止其他事务插入新的A=x行(避免幻读),但这些间隙锁不会锁定已存在的其他A=x行,仅锁定间隙位置。
- 读提交(RC)隔离级别:不会添加间隙锁,仅对实际删除的100条记录加排他锁,完全不涉及其他A=x的行。
内容的提问来源于stack exchange,提问作者Katha patel
相关产品推荐
相关产品推荐

