前言:鎖是計算機協調多個進程或線程併發訪問某一資源的機制。在數據庫中,除傳統的計算機資源(如CPU、RAM、I/O等)的爭用外,數據也是一種供許多用戶共享的資源。如何保證數據併發訪問的一致性、有效性是全部數據庫必須解決的一個問題,鎖衝突也是影響數據併發訪問性能的一個重要因素。從這個角度來講,鎖對數據庫而言顯得尤爲重要,也更加複雜。html
#1.從對數據操做的類型來分數據庫
讀鎖(共享鎖)和寫鎖(排它鎖)併發
#2.從對數據操做的粒度來分性能
表鎖和行鎖spa
特色:偏向MyISAM存儲引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,發生鎖衝突的機率最高,併發度低。下面經過案例來講明表鎖的一些狀況。線程
#1.建立mylock表,並插入5條數據。注意數據引擎使用的是MyISAM。code
drop table if exists mylock; CREATE TABLE mylock ( id INT PRIMARY KEY auto_increment, name VARCHAR (20) NOT NULL ) ENGINE MyISAM DEFAULT charset = utf8; insert into mylock (name) values ('a'); insert into mylock (name) values ('b'); insert into mylock (name) values ('c'); insert into mylock (name) values ('d'); insert into mylock (name) values ('e');
#2.手動增長表鎖命令。htm
lock table tablename1 read(write),tablename2 read(write);
#3.查看錶是否被加鎖。blog
若是In_use顯示不爲0,則表示表被加鎖。進程
#4.釋放表鎖命令
unlock tables;
#1.在mylock表上加讀鎖。將當前會話命名爲A。
在A會話中查詢mylock中的數據。
數據查詢正常,沒有任何問題。
#2.再開一個會話,命名爲B,查詢mylock中的數據。
數據查詢正常,沒有任何問題。
#3.進行其餘操做。
①在A會話中進行更新操做。
分析:
提示mylock表被加鎖,不能進行更新操做。緣由:mylock正被讀鎖鎖住,未解鎖不能進行更新操做。
②在B會話中讀其餘表。
分析:
A會話mylock表的讀鎖,並不影響B會話對mylock表和其餘表的讀操做。
③在A會話中讀其餘表。
分析:
因爲A會話對mylock表加了讀鎖,在未解鎖前,不能操做其餘表。
④在B會話中修改mylock表中的內容。
分析:
出現了阻塞狀況,緣由:因爲A會話對mylock表加鎖,在鎖未釋放時,其餘會話是不能對mylock表進行更新操做的。
⑤在A會話中對mylock表進行解鎖操做,注意觀察B會話中的變化。
分析:
在A會話中對mylock表解鎖後,B會話更新操做成功,可看到B會話中的更新操做等待了22分鐘。
#1.在A會話中對mylock表加寫鎖。
#2.在A會話中對mylock表進行讀寫操做。
分析:
因爲A會話對mylock表加的寫鎖,因此讀寫操做都執行正常。
#3.在A會話中對其餘表進行操做。
分析:
在A會話中對其餘表進行讀寫操做都失敗,由於A會話中mylock表的寫鎖並未被釋放。
#4.在B會話中對mylock表進行讀操做。
分析:
因爲mylock表已經加寫鎖,而寫鎖爲排它鎖,所以在B會話中對mylock表進行讀操做阻塞。
因爲B會話中對mylock的讀操做都阻塞,因此其餘操做也是阻塞的。
#1.使用以下命令查看是否有表被鎖定。
show open tables where In_use>0;
#2.使用以下命令分析表鎖。
show status like 'table%';
主要注意兩個變量的值:
①Table_locks_immediate:產生表級鎖定的次數,表示可當即獲取鎖的查詢次數,每當即獲取鎖一次該值加1。
②Table_locks_waited:出現表級鎖定爭用而發生等待的次數(不能當即獲取鎖的次數,每等待一次鎖該值加1),此值高則說明存在較嚴重的表級鎖爭用狀況。
注意數據庫引擎爲MyISAM。
①對MyISAM表加讀鎖,不會阻塞其餘進程對同一表(mylock)的讀操做,可是會阻塞對同一表的寫請求,只有當讀鎖釋放後,纔會執行其餘進程的寫操做。
②在加讀鎖並未釋放鎖時,該進程不能對同一表(mylock)進行寫操做,而且也不能對其餘表進行操做。
③對MyISAM表加寫鎖,會阻塞其餘進程對同一表(mylock)的讀和寫操做,只有當讀鎖釋放後,纔會執行其餘進程的寫操做。
④在加寫鎖並未釋放鎖時,該進程不能對其餘表進行操做。
簡而言之:讀鎖會阻塞寫,可是不會阻塞讀,而寫鎖會把讀和寫都阻塞。
此外,MyISAM的讀寫鎖調度是寫優先,這也是MyISAM不適合作寫爲主的表的引擎,由於寫鎖後,其餘線程不能作任何操做,大量的更新會使查詢很可貴到鎖,從而形成長時間阻塞。
by Shawn Chen,2018.6.28日,上午。