什么是间隙锁 (Gap Lock)?

推荐答案

间隙锁(Gap Lock)是 MySQL 中 InnoDB 存储引擎用于防止幻读的一种锁机制。它锁定的是一个范围,而不是具体的某一行数据。间隙锁主要用于在事务中防止其他事务在某个范围内插入新的数据,从而避免幻读问题。

本题详细解读

什么是间隙锁?

间隙锁是 InnoDB 存储引擎中的一种锁类型,它锁定的是一个索引范围,而不是具体的某一行数据。例如,如果一个事务执行了 SELECT * FROM table WHERE id BETWEEN 10 AND 20 FOR UPDATE;,那么 InnoDB 会在 id 为 10 到 20 之间的所有可能插入的位置上加上间隙锁,防止其他事务在这个范围内插入新的数据。

间隙锁的作用

间隙锁的主要作用是防止幻读(Phantom Read)。幻读是指在一个事务中,前后两次查询同一个范围的数据时,由于其他事务插入或删除了数据,导致两次查询的结果不一致。通过使用间隙锁,InnoDB 可以确保在事务执行期间,其他事务无法在锁定的范围内插入新的数据,从而避免幻读问题。

间隙锁的使用场景

间隙锁通常用于以下场景:

  1. 范围查询:当执行范围查询(如 BETWEEN>< 等)时,InnoDB 会自动在查询范围内加上间隙锁。
  2. 唯一索引:即使查询条件使用了唯一索引,InnoDB 仍然可能会加上间隙锁,以防止其他事务在范围内插入数据。
  3. 插入操作:当执行插入操作时,InnoDB 会在插入位置的前后加上间隙锁,以防止其他事务在相同位置插入数据。

间隙锁的优缺点

优点

  • 防止幻读,确保事务的一致性。
  • 提高并发控制的能力。

缺点

  • 可能会增加锁冲突的概率,降低并发性能。
  • 在某些情况下,可能会导致死锁。

示例

假设有一个表 t,其中 id 是主键:

事务 A 执行以下操作:

此时,事务 A 会在 id 为 10 到 20 之间的所有可能插入的位置上加上间隙锁。如果事务 B 尝试在 id 为 15 的位置插入一条新记录:

事务 B 会被阻塞,直到事务 A 提交或回滚。

总结

间隙锁是 InnoDB 存储引擎中用于防止幻读的重要机制。它通过锁定一个范围来防止其他事务在该范围内插入新的数据,从而确保事务的一致性。然而,间隙锁也可能导致锁冲突和死锁问题,因此在使用时需要谨慎。

纠错
反馈