MySQL中的鎖機制

2021-10-05 18:39:30 字數 2330 閱讀 4338

目錄

mysql中的鎖機制是什麼?

mysql中鎖的分類

分析innodb引擎鎖的詳細資訊

表鎖~~~

myisam引擎中表鎖的特點

myisam引擎中分析表鎖

行鎖~~~

行鎖的舉例

索引失效對行鎖的影響

間隙鎖的危害

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算機資源(cpu、ram、io)的爭用之外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性、有效性是資料庫必須解決的乙個問題。鎖衝突也是影響資料庫併發訪問效能的乙個重要因素,因此鎖對於資料庫而言尤為重要,也更加複雜

讀鎖(共享鎖s鎖) :針對同乙份資料,多個讀操作可以同時進行而不會相互影響

寫鎖(排它鎖x鎖) :當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖。

表鎖:偏向myisam儲存引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,傳送鎖衝突的概率最高,併發最低。

行鎖:偏向innodb儲存引擎,開銷大,加鎖慢,會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高

專案中可以用下面的語法分析鎖的詳細資訊

show status like 'innodb_row_lock%';

myisam引擎在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖,在執行增刪改操作前會自動給涉及的表加寫鎖mysql的表鎖有兩種模式結論:1.對myisam表的讀操作(加讀鎖)不會阻塞其他程序對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放,才會執行其他進行的寫操作

2.對myisam表的寫操作(加寫鎖)會阻塞其他程序對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他程序的讀寫操作

簡言之,讀鎖會阻塞寫,但不會阻塞讀。寫鎖會把讀和寫都阻塞 

[檢視哪些表被加鎖了]

show open tables;
[根據引數分析表鎖]

show status like 'table%';
table_locks_immediate:產生表鎖的次數table_locks_waited:出現表鎖後發生的等待和阻塞次數(重要引數)

[myisam引擎的讀寫鎖排程特點]

myisam的讀寫鎖呼叫是寫優先,這也是myisam不適合做寫為主表引擎的原因。因為寫鎖後,其他執行緒不能做任何操作,大量的更新會使查詢很難得到鎖,造成永遠阻塞。

我們知道,innodb中每個對sql語句的操作都自動應用了行鎖。在手動提交事務的前提下,a使用者更新id為4的記錄,在a使用者沒輸入commit之前,b使用者是看不到a更新後的資料的。沒提交成功之前,行鎖會像表鎖一樣基於x鎖或s鎖鎖住當前「行」。提交成功後,鎖立即被釋放。

之前我們講過,當索引失效時,sql的效能會下降,但更嚴重的是索引失效時,行鎖會變成表鎖

假如你更新的varchar欄位沒寫' ',在事務沒提交完成之前,行鎖會立馬變成表鎖。 在事務沒提交之前,不論是你操作同一行記錄或者不是同一行記錄,都會進入阻塞狀態, 直到事務提交。

什麼是間隙鎖當我們用範圍條件而不是相等條件檢索資料,並請求共享或排它鎖時,innodb會給符合條件的已有資料記錄的索引項加鎖,對於鍵值在條件範圍內但並不存在的記錄叫做間隙。即id有1,3,4。你的條件是<4並且》1,他會自動把2和3都加鎖,即使沒有id為2

間隙鎖的危害

可能會造成阻塞,對效能有很大影響。例如在操作<4並且》1時,這時候你新增id為2的記錄,新增的操作就會阻塞,直到第一條條事務提交完成 

MySQL中的鎖機制

mysql常用儲存引擎的鎖機制 myisam和memory 表級鎖 table level locking bdb 頁級鎖 page level locking 或表級鎖,預設為頁級鎖 innodb 行級鎖 row level locking 和表級鎖,預設為行級鎖 表級鎖 特點 對當前操作的整張表...

MySQL中的鎖機制

當併發事務同時訪問乙個資源時,有可能導致資料不一致,因此需要一種機制來將資料訪問順序化,以保證資料庫資料的一致性。鎖就是其中的一種機制。鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。鎖的分類 oracle 按操作劃分,可分為dml鎖 ddl鎖 按鎖的粒度...

MySQL中鎖機制

mysql儲存引擎 mysql索引 mysql鎖機制 myisam和memory採用的是表級鎖,bdb採用頁面鎖,innodb既支援行級鎖,也支援表級鎖,預設使用行級鎖。表共享讀鎖,表獨佔寫鎖 進行查詢時自動加讀鎖,進行插入,更新,刪除會自動加寫鎖,不需要顯式寫出 lock table table ...