什么时候只使用间隙锁?什么时候使用下一个键锁?为什么?

时间:2019-03-29 23:01:58

标签: mysql locking innodb

根据mysql参考https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html

  1. 对于锁定读取(具有FOR UPDATE或FOR SHARE的SELECT),UPDATE和DELETE语句,对于非唯一索引,InnoDB使用间隔锁定或next-key锁定来阻止其他会话向其插入插入,从而锁定扫描的索引范围范围覆盖的差距。
  2. UPDATE ... WHERE ...在搜索遇到的每条记录上设置排他的下一键锁定。但是,使用唯一索引锁定行以搜索唯一行的语句只需要索引记录锁。
  3. DELETE FROM ... WHERE ...在搜索遇到的每条记录上设置独占的下一键锁定。但是,对于使用唯一索引来搜索唯一行的行来锁定行的语句,只需要索引记录锁即可。

我的问题是: 1.什么时候只使用间隙锁?什么时候使用下一个键锁?为什么? 2. mysql服务器层与innodb lock之间的交互过程是什么?

在同一页面上:https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html

  1. INSERT在插入的行上设置排他锁。该锁是索引记录锁,而不是下一键锁(即没有间隙锁),并且不会阻止其他会话插入到插入行之前的间隙中。

  2. INSERT ... ON重复键更新与简单INSERT的不同之处在于,当发生重复键错误时,将排他锁而不是共享锁放在要更新的行上。对重复的主键值采用排它索引记录锁定。对于重复的唯一键值,将使用独占的下一键锁。

为什么在使用INSERT ... ON DUPLICATE KEY UPDATE而不是记录锁定时将next-key锁定用于重复的唯一密钥?

0 个答案:

没有答案