認知盲區:**WHERE 條件不匹配任何行的 UPDATE/DELETE,InnoDB 依然會加間隙鎖(Gap Lock)**,導致極易發生死鎖。本文通過最小復現案例揭示機制與規避方案。
Session 1: UPDATE ... WHERE id=1 → 鎖定 Gap (-∞, 1] + (1, 2) (Next-Key Lock) Session 2: UPDATE ... WHERE id=2 → 鎖定 Gap (1, 2] + (2, +∞) Session 1: INSERT (1) → 需插入 Gap (1, 2) → 被 Session 2 的 Gap Lock 阻塞 → WAIT Session 2: INSERT (2) → 需插入 Gap (1, 2] → 被 Session 1 的 Gap Lock 阻塞 → DEADLOCK → InnoDB 檢測到環路,選擇 Session 2 犧牲回滾
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;UPDATE ... WHERE id=? AND version=?,失敗則重試。