MySQL數(shù)據(jù)庫InnoDB引擎鎖定范圍以及sql語句使用的鎖類型

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? 文章寫的很好

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容