9.mysql锁机制

按照数据操作类型可以分为:
    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.行锁分析

posted @ 2022-05-25 21:08  努力的达子  阅读(29)  评论(0编辑  收藏  举报