MySQL鎖概述 MyISAM 表鎖

2021-08-28 06:37:20 字數 1491 閱讀 2879

相對其他資料庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。比如,myisam和memory儲存引擎採用的是表級鎖(table-level locking);bdb儲存引擎採用的是頁面鎖(page-level locking),但也支援表級鎖;innodb儲存引擎既支援行級鎖(row-level locking),也支援表級鎖,但預設情況下是採用行級鎖。

mysql這3種鎖的特性可大致歸納如下。

myisam 儲存引擎只支援表鎖,這也是mysql 開始幾個版本中唯一支援的鎖型別。隨著應用對事務完整性和併發性要求的不斷提高,mysql 才開始開發基於事務的儲存引擎,後來慢慢出現了支援頁鎖的bdb 儲存引擎和支援行鎖的innodb 儲存引擎(實際innodb 是單獨的乙個公司,現在已經被oracle 公司收購)。但是myisam 的表鎖依然是使用最為廣泛的鎖型別。

可以通過檢查table_locks_waited 和table_locks_immediate 狀態變數來分析系統上的表鎖定爭奪:

如果table_locks_waited 的值比較高,則說明存在著較嚴重的表級鎖爭用情況。

mysql 的表級鎖有兩種模式:表共享讀鎖(table read lock)和表獨佔寫鎖(table write lock)。

可見,對myisam 表的讀操作,不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫請求;對myisam 表的寫操作,則會阻塞其他使用者對同一表的讀和寫操作;myisam 表的讀操作與寫操作之間,以及寫操作之間是序列的!

當乙個執行緒獲得對乙個表的寫鎖後,只有持有鎖的執行緒可以對錶進行更新操作。其他執行緒的讀、寫操作都會等待,直到鎖被釋放為止。

myisam 在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖,在執行更新操作(update、delete、insert 等)前,會自動給涉及的表加寫鎖,這個過程並不需要使用者干預,因此,使用者一般不需要直接用lock table 命令給myisam 表顯式加鎖。

給myisam 表顯示加鎖,一般是為了在一定程度模擬事務操作,實現對某一時間點多個表的一致性讀取。

要特別說明以下兩點內容:

上文提到過myisam 表的讀和寫是序列的,但這是就總體而言的。在一定條件下,myisam表也支援查詢和插入操作的併發進行。

myisam儲存引擎有乙個系統變數concurrent_insert,專門用以控制其併發插入的行為,其值分別可以為0、1或2。

可以利用myisam儲存引擎的併發插入特性,來解決應用中對同一表查詢和插入的鎖爭用。例如,將concurrent_insert系統變數設為2,總是允許併發插入;同時,通過定期在系統空閒時段執行optimize table語句來整理空間碎片,收回因刪除記錄而產生的中間空洞。

mysql 讀寫鎖 表鎖myisam

讀鎖 session1 lock table book read unlock tables session1可以讀book 不可以寫book 也不可以讀寫其它表 session2可以讀book 也可以讀寫其它表 可以寫book 但阻塞的需要session1解鎖後unlock tables 寫鎖 s...

鎖(MySQL篇) 之MyISAM表鎖

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制,在資料庫中,除傳統的計算資源 如cpu ram i o等 的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問的乙個重要因素。相比其他資料庫而言,mysq...

MySQL系列 MyISAM表鎖詳解

s鎖 共享鎖 又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改,除非先獲取a的x鎖。x鎖 排他鎖 又稱寫鎖,若事務t對資料物件a加上x鎖,事務t可以...