一、innodb行鎖分類
record lock:記錄鎖,也就是僅僅鎖著單獨的一行
gap lock:區間鎖,僅僅鎖住一個區間(注意這裡的區間都是開區間,也就是不包括邊界值。
next-key lock:record lock+gap lock,所以next-key lock也就半開半閉區間,且是下界開,上界閉。 www.2cto.com
next-key 鎖定範圍:(負無窮大,最小第一記錄],(記錄之間],(最大記錄,正無窮大)
二、語句鎖定情況分析
SELECT ... FROM ... FOR UPDATE對讀遇到的所有索引記錄設定獨佔的next-key鎖定。
INSERT INTO ... VALUES (...)對被插入的行設定獨佔鎖定。注意,這不是一個next-key鎖定,並且不阻止其它使用者在已插入行之前的間隙插入。如果發生重複鍵錯誤,對重複的索引記錄設定共用鎖定定。
· 在一個表上初始化之前指定的AUTO_INCREMENT列之時,InnoDB在與AUTO_INCREMENT列相關聯的索引的末尾設定獨佔鎖定。在訪問自動成長計數器中,InnoDB使用專用的表鎖定模式AUTO-INC,其中鎖定僅持續到當前SQL語句的結束,而不是到整個事務的結束。InnoDB取回先前初始化的AUTO_INCREMENT列的值而不設定任何鎖定。
INSERT INTO T SELECT ... FROM S WHERE ... 對每個插入到T的行設定獨佔(非next-key)鎖定。它在S上把搜尋當作一個持續讀,但是如果MySQL二進位日誌功能被開啟,它就對S設定一個共用的next-key鎖
定。InnoDB在後一種情況不得不設定鎖定:在從一個備份的前滾恢複中,每個SQL語句不得不以與它最初被執行的方式完全同樣的方式執行。
· CREATE TABLE ... SELECT ... 把SELECT當作一個持續讀來執行,或者帶著共用鎖定定來執行,如前面的條目所述。
· 如果唯一鍵沒有衝突,REPLACE象一個插入一樣被做。另外,對必須更新的行設定一個獨佔的nextkey鎖定。
· UPDATE ... WHERE ... 對搜尋遇到的每個記錄設定一個獨佔的next-key鎖定。
· DELETE FROM ... WHERE ... 對搜尋遇到的每個記錄設定一個獨佔的next-key鎖定。
· 如果對一個表定義FOREIGN KEY約束,任何需要檢查約束條件的插入,更新或刪除對它看著檢查約束的記錄設定共用行級鎖定。InnoDB在約束失敗的情況下也設定這些鎖定。