msyql鎖定義
鎖是計算機協調多個進程或線程併發訪問某一資源的機制。在數據庫中,除傳統的計算資源(如CPU、RAM、I/O等) 的爭用以外,數據也是一種供許多用戶共享的資源。如何保證數據併發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖衝突也是影響數據庫併發訪問性能的一個重要因素。從這個角度來說,鎖對數據庫而言顯得尤其重要,也更加複雜。
鎖分類
- 從數據庫操作類型(讀寫鎖)
讀鎖:共享鎖,針對同一份數據,多個操作可以同時進行而不會相同影響。
寫鎖:排它鎖,當前寫操作沒有完成,它會阻斷其他的讀鎖或寫鎖
- 從對數據庫操作的顆粒分類
表鎖:偏讀,偏向MyISAM存儲引擎,開銷小,加鎖快,無死鎖,鎖定顆粒大,發生鎖的概率最高,併發度最低
- 案例說明
<code>mysql> create table lock_01(->
id intnot
null
primary key auto_increment,->
name varchar(20
) -> )engine myisam;/<code>
<code> mysql>showopen
tables;/<code>
<code> mysql>lock table 表名字read
(write
), 表二read
(write
); mysql>unlock tables;/<code>
<code>對lock_01表加讀鎖
lock table lock_01
read
;/<code>
MyISAM寫鎖
<code> mysql>lock
table lock_01 write;/<code>
MyISAM讀鎖結論:
1、session1對Test_01庫中的lock_01加讀鎖,對於session2來說都可以查詢lock_01,session1也可以對自己加了讀鎖的表進行查詢,但是session1無法對Test_01庫中的其他表進行查詢和寫操作,但session2可以對其他的表進行讀寫操作,但是對session1加了鎖的lock_01表進行寫操作時會發生阻塞,直到session1解鎖,即session2立即進行寫操作。
2、session1加鎖,session1只能讀自己,其他session能讀,寫會阻塞
3、session1加鎖,session1不能查其他表,直接報錯,其他session可以讀
4、session1加鎖,session1不能修改其他表,直接報錯,其他session可以對其他表進行寫操作
5、session1加鎖,session1不能修改自己,直接報錯,其他session寫會阻塞
讀鎖:讀共享、寫阻塞
MyISAM寫鎖結論:
寫鎖:排他,全阻塞
1、session1加鎖,session1可以自己讀,但不能寫,其他session全阻塞
2、session1加鎖,session1不能對其他表進行操作,其他session可以進行讀寫
如何分析表鎖定
<code>可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定:
show status like
'table%'
;/<code>
有兩個狀態變量記錄MySQL內部表級鎖定的情況,兩個變量說明如下:
- Table_locks_immediate: 產生表級鎖定的次數,表示可以立即獲取鎖的查詢次數,每立即獲取鎖值加1 ;
- Table_locks_waited: 出現表級鎖定爭用而發生等待的次數(不能立即獲取鎖的次數,每等待一次鎖值 加1),此值高則說明存在著較嚴重的表級鎖爭用情況;
此外,Myisam的讀寫鎖調度是寫優先,這也是myisam不適合做寫為主表的引擎。因為寫鎖後,其他線程不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成永遠阻塞