一.分類:mysql
二.建立示例表:sql
create table mylock(
id int not null primary key auto_increment,
name varchar(20)
)engine myisam;併發
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');spa
select * from mylock;線程
三.表鎖(偏讀)示例blog
偏向MyISAM存儲引擎,開銷小,加鎖快;無死鎖;鎖定力度大(表鎖)發生鎖衝突的機率最高,併發度最低。rem
3.1.讀鎖:it
會話1 table
lock table mylock read;class
該會話能執行的操做:
1.select * from mylock;
不能執行的操做:
1.update mylock set name='a2' where id=1; 不能更新該表
2.select * from dept; 不能查詢其餘表
其餘會話
能夠查詢mylock表
不能夠更新mylock表(會進入阻塞狀態,直到鎖釋放)
3.2寫鎖:
會話1
lock table mylock write;
該會話能執行的操做:
1.select * from mylock; 能夠查詢本表
2.update mylock set name='a2' where id=1; 更新該表
不能執行的操做:
1.select * from dept; 查詢其餘表
其餘會話
不能執行任何操做:
1.select * from mylock;
2.update mylock set name ="a3" where id=1;
簡而言之:就是讀鎖會阻塞寫,可是不會阻塞讀,而寫鎖會把讀和寫都阻塞掉
看看那些表被加鎖了:
mysql>show open tables;
如何分析鎖鎖定:
能夠經過查看table_lockes _waited和table_lock_immediate狀態變量來分析系統上的表鎖定
SQL:show status like 'table_locks%';
Table_locks_immediate:產生表級鎖定的次數,表示能夠當即獲取鎖的查詢次數,每當即獲取鎖值加1
Table_locks_waited:出現表級鎖定爭用而發生等待的次數(不能當即獲取鎖的次數,每等待一次鎖值加1),此值高說明存在嚴重的表級鎖佔用狀況。
此外Myisam的讀寫鎖調度是寫優先,這也是myisam不適合作寫爲主表的引擎。由於寫鎖後,其餘線程沒法進行任何操做,大量的更新會使查詢很可貴到鎖,從而形成永久阻塞