select ... for update阻塞
总结阻塞规则:
当前事务持有的锁 (来自 SELECT ... FOR UPDATE ) | 其他事务尝试的操作 | 是否会被阻塞? | 原因 |
---|---|---|---|
排他锁 (X Lock) 在行 R 上 | SELECT ... FROM ... (普通查询) | 否 | 读快照 (MVCC),不需要锁 |
排他锁 (X Lock) 在行 R 上 | SELECT ... FROM ... FOR UPDATE (行 R) | 是 | 需要 X 锁,与现有 X 锁冲突 |
排他锁 (X Lock) 在行 R 上 | UPDATE ... / DELETE ... (行 R) | 是 | 需要 X 锁,与现有 X 锁冲突 |
排他锁 (X Lock) 在行 R 上 | SELECT ... FROM ... LOCK IN SHARE MODE (行 R) | 是 | 需要 S 锁,与现有 X 锁冲突 |
间隙锁 / Next-Key Lock 在范围 G 上 | INSERT ... (插入到范围 G) | 是 | 插入意向锁与间隙锁冲突 (防止幻读) |
间隙锁 / Next-Key Lock 在范围 G 上 | SELECT ... FROM ... (普通查询范围 G) | 否 | 读快照 (MVCC),不需要锁 |