record lock:記錄鎖,也就是僅僅鎖著單獨(dú)的一行 gap lock:區(qū)間鎖,僅僅鎖住一個(gè)區(qū)間(注意這里的區(qū)間都是開區(qū)間,也就是不包括邊界值。 next-key lock:record lock+gap lock,所以next-key lock也就半開半閉區(qū)間,且是下界開,上界閉。 www.survivalescaperooms.com next-key 鎖定范圍:(負(fù)無窮大,最小第一記錄],(記錄之間],(最大記錄,正無窮大)
二、語句鎖定情況分析
SELECT ... FROM ... FOR UPDATE對(duì)讀遇到的所有索引記錄設(shè)置獨(dú)占的next-key鎖定。 INSERT INTO ... VALUES (...)對(duì)被插入的行設(shè)置獨(dú)占鎖定。注意,這不是一個(gè)next-key鎖定,并且不阻止其它用戶在已插入行之前的間隙插入。如果發(fā)生重復(fù)鍵錯(cuò)誤,對(duì)重復(fù)的索引記錄設(shè)置共享鎖定。 · 在一個(gè)表上初始化之前指定的AUTO_INCREMENT列之時(shí),InnoDB在與AUTO_INCREMENT列相關(guān)聯(lián)的索引的末尾設(shè)置獨(dú)占鎖定。在訪問自動(dòng)增長(zhǎng)計(jì)數(shù)器中,InnoDB使用專用的表鎖定模式AUTO-INC,其中鎖定僅持續(xù)到當(dāng)前SQL語句的結(jié)束,而不是到整個(gè)事務(wù)的結(jié)束。InnoDB取回先前初始化的AUTO_INCREMENT列的值而不設(shè)定任何鎖定。
INSERT INTO T SELECT ... FROM S WHERE ... 對(duì)每個(gè)插入到T的行設(shè)置獨(dú)占(非next-key)鎖定。它在S上把搜索當(dāng)作一個(gè)持續(xù)讀,但是如果MySQL二進(jìn)制日志功能被打開,它就對(duì)S設(shè)置一個(gè)共享的next-key鎖 定。InnoDB在后一種情況不得不設(shè)置鎖定:在從一個(gè)備份的前滾恢復(fù)中,每個(gè)SQL語句不得不以與它最初被執(zhí)行的方式完全同樣的方式執(zhí)行。
· CREATE TABLE ... SELECT ... 把SELECT當(dāng)作一個(gè)持續(xù)讀來執(zhí)行,或者帶著共享鎖定來執(zhí)行,如前面的條目所述。 · 如果唯一鍵沒有沖突,REPLACE象一個(gè)插入一樣被做。另外,對(duì)必須更新的行設(shè)置一個(gè)獨(dú)占的nextkey鎖定。 · UPDATE ... WHERE ... 對(duì)搜索遇到的每個(gè)記錄設(shè)置一個(gè)獨(dú)占的next-key鎖定。 · DELETE FROM ... WHERE ... 對(duì)搜索遇到的每個(gè)記錄設(shè)置一個(gè)獨(dú)占的next-key鎖定。 · 如果對(duì)一個(gè)表定義FOREIGN KEY約束,任何需要檢查約束條件的插入,更新或刪除對(duì)它看著檢查約束的記錄設(shè)置共享行級(jí)鎖定。InnoDB在約束失敗的情況下也設(shè)置這些鎖定。
您可能感興趣的文章:
MySQL InnoDB之事務(wù)與鎖詳解MySQL中InnoDB存儲(chǔ)引擎的鎖的基本使用教程詳談innodb的鎖(record,gap,Next-Key lock)