以下均針對可重復讀級別下的鎖規則。
原則 1:加鎖的基本單位是 next-key lock(間隙鎖+行鎖)。next-key lock 是前開后閉區間。
原則 2:查找過程中訪問到的對象才會加鎖。
優化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化為行鎖。
優化 2:索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。
一個 bug:唯一索引上的范圍查詢會訪問到不滿足條件的第一個值為止。(現已修復)
又可以歸納為:
- 查找過程中訪問到的對象才會加鎖,加鎖的基本單位是
next-key lock(前開后閉的區間)。 - 等值查詢:唯一索引會優化成行鎖;非唯一索引會向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。
- 范圍查詢:無論是否是唯一索引,范圍查詢都需要訪問到不滿足條件的第一個值為止。
同時要注意lock in share mode(共享鎖,讀鎖)與for update(獨占鎖,寫鎖)的區別。
共享鎖:只會加在對應的索引上。
獨占鎖:對應的索引上,和對應的主鍵索引上。
