MySQL高階開發 表鎖(MyISAM)

2021-08-15 08:23:56 字數 1585 閱讀 3183

標籤(空格分隔): mysql

總結鎖分析

鎖是計算機協調多個程序或者執行緒併發訪問某乙個資源的機制。

在資料庫中,除傳統的計算資源(cpu,ram,i/o等)的爭用以外,資料也是一種供許多使用者共享的資源,如何保證資料併發訪問的一致性,有效性是所有資料庫必須解決的乙個問題。鎖衝突也是影響資料庫併發訪問效能的乙個重要因素,從這個角度來說,所對資料庫尤其重要,也更加複雜。

一、從操作型別上可以將鎖分為:讀鎖和寫鎖

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

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

myisam在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖,在執行增刪改操作之前,會自動給涉及的表加寫鎖。

mysql的表級鎖有兩種模式:

表共享讀鎖(table read lock)

表獨佔寫鎖(table write lock)

結合上表,所以對myisam表進行操作,會有一下情況:

1、對myisam表的讀操作(加讀鎖),不會阻塞其他程序對同乙個表的讀請求,但會阻塞對同乙個表的寫請求,只有當讀鎖釋放後,才會執行其他程序的寫操作

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

簡而言之:讀阻塞寫,不阻塞讀。寫阻塞讀和寫二、按照資料的細粒度來分,可分為,表鎖、行鎖、頁鎖

表鎖:偏向於myisam儲存引擎,開銷小,加鎖快;無死鎖,鎖定粒度大,發生衝突概率高。併發度小。

鎖表命令:lock table tablename read,tablename2 write;

解鎖命令:unlock tables;

檢視鎖:show open tables;

可以通過檢查table_locks_waited和table_locks_immediate狀態變數來分析系統上的鎖定情況

show status like

'table%';

這裡有兩個狀態變數記錄mysql內部表級鎖定的情況,兩個變數說明如下:

table_locks_immediate:產生表級鎖定的次數,表示可以立即獲取所的查詢次數,每立即獲取鎖值加1

table_locks_waited:出現表級鎖定爭用而發生等待的次數(不能立即獲取鎖的次數,沒等待一次加1)。此值越高說明存在較嚴重的鎖爭用情況。

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

mysql高階(四) 鎖

總結 讀鎖會阻塞寫,但是不會阻塞讀 寫鎖則會把讀和寫都阻塞檢視那些表被加鎖了 show open tables 結論 myisam的讀寫鎖排程是鎖優先,不適合做寫為主表的引擎 因為寫鎖後,其它執行緒不能進行任何操作,大量的更新回使查詢阻塞。行鎖 乙個事務開啟,使用索引為條件更新資料會把這一行資料鎖定...

MySQL高階 事務和鎖

什麼是事務 一件事就可以事務,事務就是操作過程合集統稱 事務的特性 原子性 一段事務中,要麼全部完成,要麼都不完成 隔離性 兩個客戶同時操作同樣的事務的解決方案,應用及其廣泛,所以針對以上情況出現了事務的隔離級別 讀未提交 read uncommitted 讀提交 read committed 可重...

mysql什麼情況下會觸發表鎖

在上面講到的併發事務處理帶來的問題中,更新丟失 通常是應該完全避免的。但防止更新丟失,並不能單靠資料庫事務控制器來解決,需要應用程式對要更新的資料加必要的鎖來解決,因此,防止更新丟失應該是應用的責任。髒讀 不可重複讀 和 幻讀 其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決。資...