mysql常用儲存引擎的鎖機制
myisam和memory:表級鎖(table-level locking)
bdb:頁級鎖(page-level locking)或表級鎖,預設為頁級鎖
innodb:行級鎖(row-level locking)和表級鎖,預設為行級鎖
表級鎖:
特點:對當前操作的整張表加鎖。加鎖快,資源消耗少,不會出現死鎖。鎖定粒度最大,觸發鎖衝突的概率最高,併發度最低。myisam和 innodb引擎都支援表級鎖。
頁級鎖:
特點:鎖定粒度介於行級鎖和表級鎖中間,表級鎖速度快,但衝突多,行級衝突少,但速度慢。頁級進行了折衷,一次鎖定相鄰的一組記錄。開銷和加鎖時間界於表鎖和行鎖之間,會出現死鎖。併發度一般。bdb支援頁級鎖。
行級鎖:
特點:只針對當前操作的行進行加鎖。鎖定粒度最小,併發度高,可以減少資料庫操作衝突。但加鎖開銷大,速度慢,會出現死鎖。innodb支援行級鎖。
innodb支援的行級鎖種類:
1、record lock: 對索引項加鎖,鎖定符合條件的行。其他事務不能修改和刪除加鎖項;
2、gap lock: 對索引項之間的「間隙」加鎖,鎖定記錄的範圍(對第一條記錄前的間隙或最後一條將記錄後的間隙加鎖),不包含索引項本身。其他事務不能在鎖範圍內插入資料,這樣就防止了別的事務新增幻影行。
3、next-key lock: 鎖定索引項本身和索引範圍。即record lock和gap lock的結合。可解決幻讀問題(也是mysql預設隔離級別為可重複讀的原因)。
共享鎖:
特點:共享鎖(share locks,簡記為s)又被稱為讀鎖,若事務t對資料物件a加上s鎖,則事務t只能讀a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這就保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。其他使用者可以併發讀取資料,但任何事務都不能獲取資料上的排他鎖,直到已釋放所有共享鎖。
用法:
select .
..lock in share mode;
排他鎖:
特點:排它鎖(exclusive lock,簡記為x鎖)又稱為寫鎖,若事務t對資料物件a加上x鎖,則只允許t讀取和修改a,其它任何事務都不能再對a加任何型別的鎖,直到t釋放a上的鎖。它防止任何其它事務獲取資源上的鎖,直到在事務的末尾將資源上的原始鎖釋放為止。在更新操作(insert、update 或 delete)過程中始終應用排它鎖。
用法:
select .
..for update;
作用:
當乙個事務在需要獲取資源鎖定的時候,如果遇到自己需要的資源已經被排他鎖占用的時候,該事務可以需要鎖定行的表上面新增乙個合適的意向鎖。意向鎖是可以共存的。
意向共享鎖(is):
特點:表示事務準備給資料行記入共享鎖,事務在乙個資料行加共享鎖前必須先取得該錶的is鎖。
意向排他鎖(ix):
特點:表示事務準備給資料行加入排他鎖,事務在乙個資料行加排他鎖前必須先取得該錶的ix鎖。
注意:ix,is是表級鎖,不會和行級的x,s鎖發生衝突,只會和表級的x,s發生衝突。
出現死鎖的情況:
innodb的行級鎖是基於索引實現的,如果查詢語句為命中任何索引,那麼innodb會使用表級鎖。如果表沒有定義任何索引,那麼innodb會建立乙個隱藏的聚簇索引並使用這個索引來加記錄鎖。
myisam總是一次性獲得所需的全部鎖,innodb的鎖是逐步獲得的,當兩個事務都需要獲得對方持有的鎖,導致雙方都在等待,這就產生了死鎖。 發生死鎖後,innodb一般都可以檢測到,並使乙個事務釋放鎖回退,另乙個則可以獲取鎖完成事務。
如何避免死鎖:
1、通過表級鎖來減少死鎖產生的概率;
2、多個程式盡量約定以相同的順序訪問表;
3、同乙個事務盡可能做到一次鎖定所需要的所有資源。
MySQL中的鎖機制
目錄 mysql中的鎖機制是什麼?mysql中鎖的分類 分析innodb引擎鎖的詳細資訊 表鎖 myisam引擎中表鎖的特點 myisam引擎中分析表鎖 行鎖 行鎖的舉例 索引失效對行鎖的影響 間隙鎖的危害 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算機資源 cpu...
MySQL中的鎖機制
當併發事務同時訪問乙個資源時,有可能導致資料不一致,因此需要一種機制來將資料訪問順序化,以保證資料庫資料的一致性。鎖就是其中的一種機制。鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。鎖的分類 oracle 按操作劃分,可分為dml鎖 ddl鎖 按鎖的粒度...
MySQL中鎖機制
mysql儲存引擎 mysql索引 mysql鎖機制 myisam和memory採用的是表級鎖,bdb採用頁面鎖,innodb既支援行級鎖,也支援表級鎖,預設使用行級鎖。表共享讀鎖,表獨佔寫鎖 進行查詢時自動加讀鎖,進行插入,更新,刪除會自動加寫鎖,不需要顯式寫出 lock table table ...