编辑
2023-10-19
mysql
00
请注意,本文编写于 617 天前,最后修改于 617 天前,其中某些信息可能已经过时。

间隙锁(Gap Locks)和临键锁(Next-Key Locks)都是用于防止并发事务引起的问题,但它们的行为略有不同。

  1. 间隙锁(Gap Locks):

    • 行为: 间隙锁锁定一个范围,但不包括实际存在的行。它主要用于防止在已有范围内插入新数据。
    • 示例:
      sql
      -- 事务1 BEGIN; SELECT * FROM table_name WHERE key_col BETWEEN 10 AND 20 FOR UPDATE; -- 事务2 BEGIN; INSERT INTO table_name (key_col, value_col) VALUES (15, 'new_value'); -- 上述 INSERT 语句会被阻塞,因为事务1持有了范围为 [10, 20] 的间隙锁
    • 注意事项: 间隙锁可以防止新数据插入,但不阻止已有数据的更新或删除。
  2. 临键锁(Next-Key Locks):

    • 行为: 临键锁是间隙锁的一种扩展,它锁定实际存在的行和其后的间隙,防止新数据插入,同时避免了幻读问题。
    • 示例:
      sql
      -- 事务1 BEGIN; SELECT * FROM table_name WHERE key_col BETWEEN 10 AND 20 FOR UPDATE; -- 事务2 BEGIN; INSERT INTO table_name (key_col, value_col) VALUES (15, 'new_value'); -- 上述 INSERT 语句会被阻塞,因为事务1持有了范围为 [10, 20] 的临键锁
    • 注意事项: 临键锁在防止新数据插入的同时,也能解决由间隙锁引起的幻读问题。

总结区别:

  • 间隙锁主要关注阻止新数据的插入,不关心已有数据的更新或删除。
  • 临键锁在防止新数据插入的同时,还能避免幻读问题,因为它锁定实际存在的行和其后的间隙。

在具体应用中,选择使用间隙锁还是临键锁取决于事务的需求和设计,以及对并发问题的具体处理策略。

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!