Mysql 表锁
< 返回列表时间: 2020-05-12来源:OSCHINA
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
一.分类:



二.创建示例表:
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');
select * from mylock;

三.表锁(偏读)示例
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定力度大(表锁)发生锁冲突的概率最高,并发度最低。
3.1.读锁:
会话1
lock table mylock read;
该 会话能执行的操作:
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不适合做写为主表的引擎。因为写锁后,其他线程无法进行任何操作,大量的更新会使查询很难得到锁,从而造成永久阻塞


热门排行