按照数据操作类型可以分为:
1.读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会相互影响
2.写锁(排他锁):当前操作没有完成前,他会阻断其他写锁和读锁
按照对数据操作的粒度来分:
1.表锁(偏读):偏向MyISAM存储引擎,开销小,加锁快;无死锁锁定粒度大,发生锁冲突的概率最高,并发度最低
1.1【手动增加表锁:】
lock table 表名 read(write),表名2 read(write),其他;
1.2【查看锁定的表和加的锁】
show open tables;
1.3【释放表锁】
unlock tables;
结论:
加读锁
1.如果1会话给A表加了读锁,1会话读取a表正常,但是不能做更新a表的操作,并且2会话的更新A表操作会进入阻塞状态,直至表a的读锁去掉
2.2会话可以正常读取加了读锁的a表信息
加了写锁:
1.如果1会话给A表加了写锁,1会话对a锁的读取和更新均可以,但是1会话不能查询其他表
2.2会话可以读取更新其他表,但是不能读取更新A表
简而言之:
读锁会阻塞写,但是不会阻塞读
写锁会堵塞读和写
2.行锁(偏写):偏向于innodb存储,开销大,加锁慢,会出现死锁;锁的粒度最小,发生锁冲突的概率最低,并发度最高;
无索引,行锁升级为表锁
场景如下:
如果a字段是int 类型,b字段是varcahr类型,在ab字段均建立索引
做更新操作:update 表名 set a=1 b=4000;b varcahr字段并没有加单引号,导致b字段索引失效,行锁会升级为表锁,
这时其他进程再做更新操作会阻塞,
手动锁定一行:
select * from user where id=1 for update;
2.1间隙锁危害
【什么是间隙锁:】
当我们用范围条件而不是等值条件检索数据,并请求共享或排他锁时,innoDb会给复合条件的已有数据记录的索引项加锁;
对键值在条件范围内但并不存在的记录,叫做"间隙(GAP)"
InnoDB也会对这个间隙加锁,这种锁机制就是所谓的间隙锁(Next-key锁)
【危害】
因为Query执行过程中通过范围查找的话,它会锁定整个范围内所有的索引键值,即使这个键值并不存在
间隙锁有个致命的若覅,就是当锁定一个范围的键值之后,即使某些不存在的键值也会被无辜的锁定,而做成锁定的时候无法插入锁定键值范围内的任何数据
在某些场景下这可能会对性能造成很大的危害
2.2行锁分析建议:
1.尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
2.合理设置索引,尽量缩小锁的范围
3.尽可能较少检索条件,避免间隙锁
4.尽量控制事务大小,减少锁定资源和时间长度
5.尽量降低事务的隔离级别
3.页锁
1.间隙锁

2.show open tables;查看锁定的表

3.表锁分析

4.Innodb和MyISAM

5.行锁分析
