mysql之innodb的鎖分類介紹
更新時間:2012年11月20日 15:51:11 作者:
本文將介紹mysql之innodb的鎖分類,需要了解更多的朋友可以參考下
一、innodb行鎖分類
record lock:記錄鎖,也就是僅僅鎖著單獨的一行
gap lock:區(qū)間鎖,僅僅鎖住一個區(qū)間(注意這里的區(qū)間都是開區(qū)間,也就是不包括邊界值。
next-key lock:record lock+gap lock,所以next-key lock也就半開半閉區(qū)間,且是下界開,上界閉。 www.dbjr.com.cn
next-key 鎖定范圍:(負(fù)無窮大,最小第一記錄],(記錄之間],(最大記錄,正無窮大)
二、語句鎖定情況分析
SELECT ... FROM ... FOR UPDATE對讀遇到的所有索引記錄設(shè)置獨占的next-key鎖定。
INSERT INTO ... VALUES (...)對被插入的行設(shè)置獨占鎖定。注意,這不是一個next-key鎖定,并且不阻止其它用戶在已插入行之前的間隙插入。如果發(fā)生重復(fù)鍵錯誤,對重復(fù)的索引記錄設(shè)置共享鎖定。
· 在一個表上初始化之前指定的AUTO_INCREMENT列之時,InnoDB在與AUTO_INCREMENT列相關(guān)聯(lián)的索引的末尾設(shè)置獨占鎖定。在訪問自動增長計數(shù)器中,InnoDB使用專用的表鎖定模式AUTO-INC,其中鎖定僅持續(xù)到當(dāng)前SQL語句的結(jié)束,而不是到整個事務(wù)的結(jié)束。InnoDB取回先前初始化的AUTO_INCREMENT列的值而不設(shè)定任何鎖定。
INSERT INTO T SELECT ... FROM S WHERE ... 對每個插入到T的行設(shè)置獨占(非next-key)鎖定。它在S上把搜索當(dāng)作一個持續(xù)讀,但是如果MySQL二進(jìn)制日志功能被打開,它就對S設(shè)置一個共享的next-key鎖
定。InnoDB在后一種情況不得不設(shè)置鎖定:在從一個備份的前滾恢復(fù)中,每個SQL語句不得不以與它最初被執(zhí)行的方式完全同樣的方式執(zhí)行。
· CREATE TABLE ... SELECT ... 把SELECT當(dāng)作一個持續(xù)讀來執(zhí)行,或者帶著共享鎖定來執(zhí)行,如前面的條目所述。
· 如果唯一鍵沒有沖突,REPLACE象一個插入一樣被做。另外,對必須更新的行設(shè)置一個獨占的nextkey鎖定。
· UPDATE ... WHERE ... 對搜索遇到的每個記錄設(shè)置一個獨占的next-key鎖定。
· DELETE FROM ... WHERE ... 對搜索遇到的每個記錄設(shè)置一個獨占的next-key鎖定。
· 如果對一個表定義FOREIGN KEY約束,任何需要檢查約束條件的插入,更新或刪除對它看著檢查約束的記錄設(shè)置共享行級鎖定。InnoDB在約束失敗的情況下也設(shè)置這些鎖定。
record lock:記錄鎖,也就是僅僅鎖著單獨的一行
gap lock:區(qū)間鎖,僅僅鎖住一個區(qū)間(注意這里的區(qū)間都是開區(qū)間,也就是不包括邊界值。
next-key lock:record lock+gap lock,所以next-key lock也就半開半閉區(qū)間,且是下界開,上界閉。 www.dbjr.com.cn
next-key 鎖定范圍:(負(fù)無窮大,最小第一記錄],(記錄之間],(最大記錄,正無窮大)
二、語句鎖定情況分析
SELECT ... FROM ... FOR UPDATE對讀遇到的所有索引記錄設(shè)置獨占的next-key鎖定。
INSERT INTO ... VALUES (...)對被插入的行設(shè)置獨占鎖定。注意,這不是一個next-key鎖定,并且不阻止其它用戶在已插入行之前的間隙插入。如果發(fā)生重復(fù)鍵錯誤,對重復(fù)的索引記錄設(shè)置共享鎖定。
· 在一個表上初始化之前指定的AUTO_INCREMENT列之時,InnoDB在與AUTO_INCREMENT列相關(guān)聯(lián)的索引的末尾設(shè)置獨占鎖定。在訪問自動增長計數(shù)器中,InnoDB使用專用的表鎖定模式AUTO-INC,其中鎖定僅持續(xù)到當(dāng)前SQL語句的結(jié)束,而不是到整個事務(wù)的結(jié)束。InnoDB取回先前初始化的AUTO_INCREMENT列的值而不設(shè)定任何鎖定。
INSERT INTO T SELECT ... FROM S WHERE ... 對每個插入到T的行設(shè)置獨占(非next-key)鎖定。它在S上把搜索當(dāng)作一個持續(xù)讀,但是如果MySQL二進(jìn)制日志功能被打開,它就對S設(shè)置一個共享的next-key鎖
定。InnoDB在后一種情況不得不設(shè)置鎖定:在從一個備份的前滾恢復(fù)中,每個SQL語句不得不以與它最初被執(zhí)行的方式完全同樣的方式執(zhí)行。
· CREATE TABLE ... SELECT ... 把SELECT當(dāng)作一個持續(xù)讀來執(zhí)行,或者帶著共享鎖定來執(zhí)行,如前面的條目所述。
· 如果唯一鍵沒有沖突,REPLACE象一個插入一樣被做。另外,對必須更新的行設(shè)置一個獨占的nextkey鎖定。
· UPDATE ... WHERE ... 對搜索遇到的每個記錄設(shè)置一個獨占的next-key鎖定。
· DELETE FROM ... WHERE ... 對搜索遇到的每個記錄設(shè)置一個獨占的next-key鎖定。
· 如果對一個表定義FOREIGN KEY約束,任何需要檢查約束條件的插入,更新或刪除對它看著檢查約束的記錄設(shè)置共享行級鎖定。InnoDB在約束失敗的情況下也設(shè)置這些鎖定。
相關(guān)文章
MySQL delete刪除數(shù)據(jù)后釋放磁盤空間的操作方法
這篇文章主要介紹了MySQL delete刪除數(shù)據(jù)后,釋放磁盤空間,文中給大家介紹了優(yōu)化表空間的多種方法,每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05MySQL之select、distinct、limit的使用
這篇文章主要介紹了MySQL之select、distinct、limit的使用,下面文章圍繞select、distinct、limit的相關(guān)資料展開聚集內(nèi)容,需要的朋友可以參考一下2021-11-11Linux系統(tǒng)下實現(xiàn)遠(yuǎn)程連接MySQL數(shù)據(jù)庫的方法教程
MySQL默認(rèn)root用戶只能本地訪問,不能遠(yuǎn)程連接管理mysql數(shù)據(jù)庫,Linux如何開啟mysql遠(yuǎn)程連接?下面這篇文章主要給大家介紹了在Linux系統(tǒng)下實現(xiàn)遠(yuǎn)程連接MySQL數(shù)據(jù)庫的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06Oracle和MySQL中生成32位uuid的方法舉例(國產(chǎn)達(dá)夢同Oracle)
近日遇到朋友問及如何生成UUID,UUID是通用唯一識別碼(Universally Unique Identifier)方法,這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Oracle和MySQL中生成32位uuid的方法,需要的朋友可以參考下2023-08-08mysql使用left?join連接出現(xiàn)重復(fù)問題的記錄
這篇文章主要介紹了mysql使用left?join連接出現(xiàn)重復(fù)問題的記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03