间歇锁是InnoDB在可重复读下为防止幻读而锁定索引间隙的机制,如执行SELECT ... FOR UPDATE WHERE id BETWEEN 2 AND 8时会锁定(1,5)和(5,10)间隙,阻止其他事务插入新行;其在范围查询、非唯一索引行锁等场景触发,通过封锁插入保障一致性,但降低并发并增加死锁风险,仅在RR级别生效;可通过优化索引、使用等值查询、调整隔离级别至RC或缩短事务来减少影响。

MySQL的间歇锁(Gap Lock)是InnoDB存储引擎在可重复读(REPEATABLE READ)隔离级别下用来防止幻读的一种重要机制。它并不是锁定某一行数据,而是锁定索引记录之间的“间隙”,从而阻止其他事务在这个范围内插入新的记录。理解间歇锁的特性对避免死锁、提升并发性能至关重要。
间歇锁作用于索引记录之间的间隙,或者在第一个索引记录之前、最后一个索引记录之后的区间。它不锁定记录本身,而是锁定一个范围,防止其他事务向该范围插入新行。
例如,若表中存在主键为1、5、10的记录,那么(1,5)和(5,10)之间的区间就是可能被间歇锁锁定的区域。如果一个事务执行了SELECT ... FOR UPDATE WHERE id BETWEEN 2 AND 8,InnoDB会锁定(1,5)和(5,10)这两个间隙,防止其他事务插入id=3或id=7这样的记录。
间歇锁主要在以下场景中出现:
注意:等值查询且命中唯一索引(如主键)时,InnoDB只加记录锁,不会加间歇锁,因为此时可以确定不存在幻读风险。
间歇锁的核心目标是解决“幻读”问题。通过封锁插入操作,确保在同一事务中多次执行相同范围查询时结果一致。
但间歇锁也带来了一些副作用:
虽然间歇锁有助于一致性,但在某些场景下可以通过策略优化其影响:
基本上就这些。间歇锁是InnoDB实现MVCC和一致性读的重要补充机制,虽然增加了复杂度,但在多数OLTP场景中利大于弊。关键在于理解其行为模式,并结合实际业务合理设计SQL与事务逻辑。
以上就是mysql间歇锁的特性分析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号