Mysql 表鎖

一.分類: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不適合作寫爲主表的引擎。由於寫鎖後,其餘線程沒法進行任何操做,大量的更新會使查詢很可貴到鎖,從而形成永久阻塞

相關文章
相關標籤/搜索