间隙锁可以解决幻读问题,因为它可以锁住索引之间的空隙,从而防止其他事务在这些空隙中插入新记录。

举例说明

假设在一个数据库中有如下数据:

  • 数据表中有记录:ID: 1, 3, 5

场景

  1. 事务 A 开始:
  • 执行查询:SELECT * FROM table WHERE ID > 1 AND ID < 5;
  • 结果返回:ID: 3
  • 为防止幻读,事务 A 对 (1, 5) 之间的间隙加锁。
  1. 事务 B 尝试插入:
  • 插入一条新记录:ID: 4
  • 因为间隙锁存在,事务 B 被阻塞,不能插入。
  1. 事务 A 提交或回滚:
  • 间隙锁释放。

通过这种方式,间隙锁防止了事务 B 插入 ID: 4,从而避免了事务 A 在后续操作中看到“幻影”行。这样,事务 A 在整个过程中看到的结果集是一致的,解决了幻读问题。