MySQL

除了 UPDATE 和 FOR UPDATE,还有谁会拿行锁

  • DELETE:和 UPDATE 一样,扫到的行加排他锁。
  • INSERT:新行隐式加排他锁,插入前还要拿插入意向锁;撞了唯一键,会在已有的那行上加共享锁。
  • INSERT … ON DUPLICATE KEY UPDATE / REPLACE:撞键的那行加排他锁。
  • INSERT … SELECT、CREATE TABLE … SELECT:源表扫到的行加共享锁。
  • 多表 UPDATE / DELETE:只读不改的那张表,也加共享锁。
  • 外键检查:在父表或子表的行上加共享锁。
  • SERIALIZABLE 下的普通 SELECT:自动变成 FOR SHARE。

最容易忽略的是 INSERT ... SELECT:一条看起来只是「复制数据」的语句,会把源表扫过的行都锁住。

esc