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不适合作写为主表的引擎。由于写锁后,其余线程没法进行任何操做,大量的更新会使查询很可贵到锁,从而形成永久阻塞

相关文章
相关标签/搜索