间隙锁可以解决幻读问题,因为它可以锁住索引之间的空隙,从而防止其他事务在这些空隙中插入新记录。
举例说明
假设在一个数据库中有如下数据:
- 数据表中有记录:
ID: 1, 3, 5
场景
- 事务 A 开始:
- 执行查询:
SELECT * FROM table WHERE ID > 1 AND ID < 5; - 结果返回:
ID: 3 - 为防止幻读,事务 A 对
(1, 5)之间的间隙加锁。
- 事务 B 尝试插入:
- 插入一条新记录:
ID: 4 - 因为间隙锁存在,事务 B 被阻塞,不能插入。
- 事务 A 提交或回滚:
- 间隙锁释放。
通过这种方式,间隙锁防止了事务 B 插入 ID: 4,从而避免了事务 A 在后续操作中看到“幻影”行。这样,事务 A 在整个过程中看到的结果集是一致的,解决了幻读问题。
















