Innodb搜尋引擎的鎖機制

2021-09-26 05:45:21 字數 1176 閱讀 1286

看了好幾天部落格,學的挺艱難,由於鎖的種模擬較多,大多數部落格僅僅是羅列出來,分不清這些概念的上下級或者說包含關係,也可以理解為每個概念的作用域,所以看起來很痛苦,也記不住,有種死記硬背的感覺。然後今天突發靈感,有了一點突破,記錄一下,如有不對,日後再修改。

下面定義的共享鎖、排它鎖,應該說只是乙個廣泛的行鎖的概念。就像我們說汽車、房子、飲料,而沒有說具體的什麼汽車、什麼房子、什麼飲料。而像下面會提到的record lock、gap lock、next-key lock這三種鎖,應該就是具體的行鎖,比如客車、別墅、冰紅茶。這三種具體行鎖分別屬於共享鎖、排他鎖兩個大類別類別。具體屬於哪個類別那要看加鎖場景。如果是select語句加鎖,那就屬於共享鎖類別、如果是insert、delete、update加鎖,那就屬於排它鎖類別。

宣告:非本專業人員,如有不對,希望有緣人不吝賜教。

innodb 有以下兩種型別的鎖

共享鎖(s):允許乙個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。

排他鎖(x):允許獲得排他鎖的事務更新資料,阻止其他事務取得相同資料集的共享讀鎖和排他寫鎖。

除此之外還有兩種意向鎖

意向共享鎖(is):事務打算給資料行加行共享鎖,事務在給乙個資料行加共享鎖前必須先取得該錶的is鎖。

意向排他鎖(ix):事務打算給資料行加行排他鎖,事務在給乙個資料行加排他鎖前必須先取得該錶的ix鎖。

意向鎖是innodb自動加的,不需要使用者干預。update/delete/insert 語句 innodb 會自動給涉及的資料集加排他鎖。普通的 select 語句 innodb 不加鎖。不過可以在語句中顯式的給資料集加共享鎖或者排他鎖。

在 rc(read commited)級別中,資料的讀取都是不加鎖的,但是資料的寫入、修改和刪除是需要加鎖的。

innodb 行鎖是通過給索引項加鎖實現的,如果沒有索引,innodb 將通過隱藏的聚簇索引來對記錄加鎖。innodb 行鎖有三種情形:

record lock:對索引項加鎖

gap lock:對索引之間的「間隙」、第一條記錄前的「間隙」或最後一條記錄的「間隙」加鎖。

next-key lock:前兩種的組合,對記錄及其前面的間隙加鎖。

如果不通過索引條件檢索資料,那麼 innodb 將對錶中的所有記錄加鎖,實際效果就和表鎖一樣了。

引用文章:

mysql搜尋引擎innodb和myisam的區別

上次面試中被問到mysql的搜尋引擎innodb和myisam的區別,一臉懵逼。面試後趕緊查了一下,其主要區別如下 1 儲存檔案 innodb儲存的檔案有.frm格式的表定義檔案和.ibd格式的資料檔案 而myisam儲存的檔案包含.frm格式的表定義檔案 myd的資料檔案 myi的索引檔案。inn...

搜尋引擎 索引

正排索引 文件編號,單詞編號,單詞的數量,單詞出現的位置。倒排索引 1,單詞詞典,儲存單詞以及統計資訊,單詞在記錄表中的便宜,可常駐記憶體,用雜湊表儲存。2,記錄表,單詞對應的文件集合,記錄單詞出現的數目 位置。文件採用差分變長編碼。其中文件可按編號公升序排列 可利用差分編碼 也可按出現次數排列,可...

MySQL搜尋引擎程式 mysql搜尋引擎

mysql是我們比較常用的一種資料庫軟體。它有著諸多的優點,如開源的,免費的等等。其實它還有乙個很好的特點,那就是有多種引擎可以供你選擇。如果賽車手能根據不同的路況,地形隨手更換與之最適宜的引擎,那麼他們將創造奇蹟。然而目前他們還做不到那樣便捷的更換引擎,但是我們卻可以 所謂知己知彼方可百戰不殆,要...