锁的分类(两锁)
从对数据操作的类型分:读/写锁
读锁(共享锁):针对同一份数据,多个操作可以同时进行而不会互相影响
写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁
从对数据操作的粒度分:表锁和行锁
锁的分类(三锁)
1、表锁(偏读):偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。
手动增加表锁:lock table 表名字 read(write),表名字2 read(write),其他;
查看哪些表被加上锁:show open tables;
释放表锁:unlock tables;
如何分析表锁定:
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定。SQL:show status like ‘table%’;
table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每次立即获得锁值加1;
table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况。
此外,MyISAM的读写锁调度是读优先,这也是MyISAM不适合做写为主的表的引擎,因为写锁后,其他线程不能做任何操作,大量的更新会使得查询很难得到锁,从而造成永远阻塞。
2、行锁(偏写):偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁粒度最小,发生锁冲突的概率最低,并发度也最高;InnoDB与MyISAM的最大不同有两点:一是支持事务,而是支持行级锁。
索引失效会导致行锁变表锁。
行锁分析:通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况,show status like ‘%innodb_row_lock%’;
3、页锁:开销和加锁时间介于行锁和表锁之间;会出现死锁;锁粒度介于表锁和行锁之间,并发度一般。