表锁
1、特点:
偏向MyISAM存储引擎,开销小,加锁块,无死锁,锁定力度大,发生锁冲突的概率高,并发度低。
2、查看是否加锁:SHOW OPEN TABLES
,加锁命令:lock table 表名 read, 表名 write,......
,释放表unlock tables
(1) 加读锁(偏读)
- 线程1,加表读锁,线程1可读,不可写;不可以读其他表。
- 线程2,可以读表,也可以读其他的表,但是修改线程1加读锁的表会堵塞。
(2)加写锁(偏写) - 线程1,加写锁,线程1可以读自己锁过的表,自己可以修改自己锁过的表,自己不能读其他表
- 线程2,能查其他的表,读线程1加锁的表会被阻塞,知道表锁释放。
3、总结
总之,读锁会堵塞写,但是不会阻塞读,而写锁,会把读和写都阻塞
4、表锁分析
(1)SHOW OPEN TABLES
可以查看哪些表被锁
(2)可以通过检查table_locks_watied
和table_locks_immedinate
状态变量来分析系统上的表锁定:show status like 'table%';
-
table_locks_immedinate
表示表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1. -
table_locks_watied
出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在较严重的表级锁争用情况。
此外MyISAM引擎读写所调度是写优先,这也是MyISAM不适合做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。