for update skip locked
結論:
- 在加鎖之前判斷記錄是否已經被其它會話鎖定
- 如果已經鎖定,那麼跳過該已鎖定的記錄
- 如果沒有鎖定,那麼鎖定該未鎖定的記錄
驗證如下,基礎數據:
SELECT * FROM stu_info t WHERE t.id IN (1, 2);
session1:
-- 鎖住 id = 1 的所有記錄
SELECT * FROM stu_info t WHERE t.id = 1 FOR UPDATE;
session2:
-- 鎖住 id in (1, 2) 中未被鎖定的記錄 (跳過已經鎖定的記錄)
SELECT * FROM stu_info t WHERE t.id IN (1, 2) FOR UPDATE SKIP LOCKED;