除了 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:一条看起来只是「复制数据」的语句,会把源表扫过的行都锁住。