MySQL鎖機制概述及表鎖分析

MySQL鎖機制

定義:

鎖是計算機協調多個進程或線程併發訪問某一資源的機制。

在數據庫中中,除傳統的計算資源(如CPU、RAM、I/O等) 的爭用以外,數據也是一種供多個用戶共享的資源。如何保證數據併發訪問的一致性、有效性是所有數據庫必須解決的問題,鎖衝突也是影響數據庫併發訪問性能的一個重要因素。因此,鎖對於數據庫也是很重要的。

鎖的分類

從數據操作的類型可分爲讀鎖、寫鎖

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

寫鎖(排他鎖):當前寫操作沒有完成前,它會組大運其他寫鎖和讀鎖。

從對數據操作的顆粒度上可分爲表鎖、行鎖。

表鎖

特點:偏向MyISAM存儲引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,發生鎖衝突的概率最高,併發最低。

以dept表爲例演示表鎖

手動添加表鎖

lock table 表名稱 read(write),表名稱2 read(write)…

查看錶上加過的鎖

show open tables;

釋放表鎖

unlock tables;

爲dept表加讀鎖

lock table dept read;

在這裏插入圖片描述
在這裏插入圖片描述

爲dept加寫鎖

lock table dept write;

在這裏插入圖片描述

在這裏插入圖片描述

可見加了寫鎖後,其他會話連讀都不能了,更別說其他會話的寫操作了。

結論:讀讀共享,讀寫互斥,寫寫互斥

表鎖分析

查看哪些表被加鎖了

show open tables;

如何分析表鎖定

可以通過檢查table_locks_waitedtable_locks_immediate狀態變量來分析系統上的表鎖定。

show status like 'table%';

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

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

mysql> show status like 'table%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Table_locks_immediate      | 105   |
| Table_locks_waited         | 0     |
| Table_open_cache_hits      | 41    |
| Table_open_cache_misses    | 4     |
| Table_open_cache_overflows | 0     |
+----------------------------+-------+

因爲MyISAM支持表鎖,而MyISAM的讀寫鎖調度是寫優先,這也是MyISAM不適合做寫爲主的引擎的原因。因爲寫鎖後,其他線程不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成長時間的阻塞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章