MySQL InnoDB支持三種行鎖定方式:
- 行鎖(Record Lock):鎖直接加在索引記錄上面,鎖住的是key。
- 間隙鎖(Gap Lock):鎖定索引記錄間隙,確保索引記錄的間隙不變。間隙鎖是針對事務隔離級別為可重復讀或以上級別而已的。
- Next-Key Lock :行鎖和間隙鎖組合起來就叫Next-Key Lock。
鎖選擇
- 如果更新條件沒有走索引,例如執行”update from t1 set v2=0 where v2=5;” ,此時會進行全表掃描,掃表的時候,要阻止其他任何的更新操作,所以上升為表鎖。
- 如果更新條件為索引字段,但是並非唯一索引(包括主鍵索引),例如執行“update from t1 set v2=0 where v1=9;” 那么此時更新會使用Next-Key Lock。使用Next-Key Lock的原因:
- 首先要保證在符合條件的記錄上加上排他鎖,會鎖定當前非唯一索引和對應的主鍵索引的值;
- 還要保證鎖定的區間不能插入新的數據。
- 如果更新條件為唯一索引,則使用Record Lock(記錄鎖)。
- InnoDB根據唯一索引,找到相應記錄,將主鍵索引值和唯一索引值加上記錄鎖。但不使用Gap Lock(間隙鎖)
