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_waited
和table_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不適合做寫爲主的引擎的原因。因爲寫鎖後,其他線程不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成長時間的阻塞。