1.InnoDB引擎使用了七種類型的鎖,他們分別是:
共享鎖(S鎖)/排它鎖(X鎖)
意向鎖(Intention Locks):表級別的鎖
記錄鎖(Record Locks):記錄鎖是一種加在索引數(shù)據(jù)記錄上鎖,以防止其他事務對于該數(shù)據(jù)記錄進行修改、刪除。
間隙鎖(Gap Locks):間隙鎖是加載某個索引記錄區(qū)間上的鎖,間隙鎖防止其他事務在鎖定區(qū)間上插入新的記錄,避免不可重復讀。
?臨鍵鎖(Next-Key Locks):臨鍵鎖是記錄鎖和間隔鎖的結合,它既可以鎖定索引記錄也可以鎖定索引記錄之間的區(qū)間。臨鍵鎖主要的目的是解決幻讀的問題。
插入意圖鎖(Insert Intention Locks):插入意向鎖是一種間隙鎖,當事務視圖想向一個區(qū)間插入數(shù)據(jù)時,首先獲得插入意向鎖。
插入間隙鎖規(guī)定,如果多個事務向同一區(qū)間插入數(shù)據(jù)時,如果這些數(shù)據(jù)屬于不同的位置(索引位置),那么之間的插入是互不影響的。
自增鎖(AUTO-INC Locks):自增鎖是一種特殊表鎖
2. 加鎖語句
select ... from語句:InnoDB引擎采用多版本并發(fā)控制(MVCC)的方式實現(xiàn)了非阻塞讀,所以對于普通的select讀語句,InnoDB并不會加鎖【注1】。
select ... from lock in share mode語句:這條語句和普通select語句的區(qū)別就是后面加了lock in share mode,通過字面意思我們可以猜到這是一條加鎖的讀語句,并且鎖類型為共享鎖(讀鎖)。InnoDB會對搜索的所有索引記錄加next-key鎖,但是如果掃描的唯一索引的唯一行,next-key降級為索引記錄鎖。
select ... from for update語句:和上面的語句一樣,這條語句加的是排他鎖(寫鎖)。InnoDB會對搜索的所有索引記錄加next-key鎖,但是如果掃描唯一索引的唯一行,next-key降級為索引記錄鎖。
update ... where ...語句:。InnoDB會對搜索的所有索引記錄加next-key鎖,但是如果掃描唯一索引的唯一行,next-key降級為索引記錄鎖。【注2】
delete ... where ...語句:。InnoDB會對搜索的所有索引記錄加next-key鎖,但是如果掃描唯一索引的唯一行,next-key降級為索引記錄鎖。
insert語句:InnoDB只會在將要插入的那一行上設置一個排他的索引記錄鎖。
如果一個查詢使用了輔助索引并且在索引記錄加上了排他鎖,InnoDB會在相對應的聚合索引記錄上加鎖。
如果你的SQL語句無法使用索引,這樣MySQL必須掃描整個表以處理該語句,導致的結果就是表的每一行都會被鎖定,并且阻止其他用戶對該表的所有插入。
注1:在事務隔離級別為SERIALIZABLE時,普通的select語句也會對語句執(zhí)行過程中掃描過的索引加上next-key鎖。如果語句掃描的是唯一索引,那就將next-key鎖降級為索引記錄鎖了。?
注2:當更新語句修改聚合索引(主鍵)記錄時,會對受影響的輔助索引執(zhí)行隱性的加鎖操作。當插入新的輔助索引記錄之前執(zhí)行重復檢查掃描時和當插入新的輔助索引記錄時,更新操作還對受影響的輔助索引記錄添加共享鎖。
參考自:https://segmentfault.com/a/1190000013307132? 文章寫的很好