加载中...

| 类型 | 行级锁 |
| 所属引擎 | InnoDB |
| 锁定对象 | 索引间隙 |
| 主要作用 | 防止幻读 |
| 生效级别 | 可重复读 |
间隙锁(Gap Lock)是 MySQL 的 InnoDB 存储引擎所采用的一种特殊行级锁。它并不锁定某条具体的索引记录,而是锁定索引记录之间的空隙区间,目的是阻止其他事务在这个区间内插入新记录,是 InnoDB 在可重复读隔离级别下防止幻读的关键机制。
在并发事务中,如果一个事务按范围条件查询数据,另一个事务恰好在该范围内插入了新行,那么前一个事务再次执行相同查询时就会看到之前不存在的行,这种现象称为幻读。为消除幻读,InnoDB 引入了间隙锁,把查询涉及的索引区间整体锁住,使区间内无法插入新数据。
间隙锁在范围更新、范围删除以及带范围条件的加锁查询中被自动使用,保证事务在其操作区间内看到一致的数据视图。理解间隙锁有助于排查并发场景下的死锁与锁等待问题,尤其是在高并发写入且事务持有时间较长的业务中,合理设计索引与事务边界能显著减少间隙锁带来的冲突。
问:为什么明明没有并发写同一行却发生了锁等待?答:很可能是间隙锁在起作用。当事务以范围条件加锁时,会锁住相应索引间隙,即便另一个事务想插入的行与已有行都不相同,只要落在被锁间隙内也会被阻塞。
问:如何减少间隙锁带来的冲突?答:可以通过缩短事务持续时间、为查询条件建立合适索引使加锁范围更精确,或在业务允许时改用读已提交隔离级别以关闭大部分间隙锁,从而降低锁竞争。

| 类型 | 行级锁 |
| 所属引擎 | InnoDB |
| 锁定对象 | 索引间隙 |
| 主要作用 | 防止幻读 |
| 生效级别 | 可重复读 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧