• mysql锁的类型


    基于锁的属性分类:共享锁、排他锁
    基于锁的力度分类:页级锁(BDB引擎)、表级锁(InnoDb、Myisam)、行级锁(InnoDb)、记录锁、间隙锁、临键锁(next-key lock)
    基于锁的状态分类:意向共享锁、意向排他锁

    • 共享锁

    共享锁又称读锁,简称S锁;当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,而不能对数据加写锁,知道所有的读锁释放之后,其他事务才能对进行加写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复都的问题。

    • 排他锁

    排他锁又称写锁,简称X锁;当一个事务为数据加上写锁时,其他请求将不能再为数据加任何锁,知道该锁释放之后,其他事务才能对数据进行加锁。排他锁的目的是在数据修改的时候,不允许其他人同时修改,也不允许其他人读取。避免了出现脏数据和脏读问题。

    • 表锁

    表锁是指上锁的时候锁住的时整个表,当下一个事务访问该表的时候,必须等待前一个事务释放了锁才能进行对表进行访问。
    特点:粒度大,加锁简单,容易冲突

    • 行锁

    行锁是指上锁的时候锁住的是表的某一行或者多行记录,其他事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可以正常访问。
    特点:粒度小,加锁比表锁麻烦,不容易起冲突,相比表锁并发度要高

    • 页锁

    页级锁时MYSQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级锁冲突少,但速度慢。所以取了折中的页级锁,一次锁定一个页的大小(默认16K)
    特点:开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般

    • 记录锁

    记录锁也属于行锁中的一种,只不过记录锁的范围只是表中的某一条记录,记录锁是说事务在加锁后锁住的只是表的某一条记录。
    精准条件命中,并且命中的条件字段是唯一索引
    加了记录锁之后可以避免数据在查询的时候被修改造成重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题。

    • 间隙锁

    属于行级锁中的一种,间隙锁是在事务加锁后,锁住的是表记录的某一个区间,当表的相邻ID之间出现空隙会形成一个区间,遵循左开右闭。
    范围查询并且查询未命中记录,查询条件必须命中索引、间隙锁只会出现在可重复读的事务隔离级别中。
    触发条件:防止幻读问题

    • 临键锁

    也属于行锁的一种,并且他是InnoDb的行锁默认算法,总结来说,他就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙也锁住,把相邻的下一个区间锁住
    触发条件:范围查询命中,查询命中索引
    结合记录锁和间隙锁的特点,临键锁避免了在范围查询时出现脏读、重复度、幻读问题。加了临键锁之后,在范围区间内数据不允许被修改和插入。

    如果当事务A加锁成功之后就设置一个状态告诉后面的人,已经有人对表里的行加了排他锁了,你们不能对整个表加共享锁或者排他锁;额,那么后面需要对整个表加锁的人只需要获取这个状态就知道自己是不是可以对表加锁,避免了对整个索引树的每个节点扫描是否加锁,这个状态就是意向锁。

    • 意向共享锁

    当一个事务试图对整个表进行加共享锁之前,首先需要获得这个表的意向共享锁

    • 意向排他锁

    当一个事务试图对整张表加排他锁之前,首先需要获得这个表的意向排他锁。

  • 相关阅读:
    【洛谷P1948】[USACO08JAN]电话线
    【洛谷P1967】[NOIP2013]货车运输
    【题解】洛谷P2926 [USACO08DEC]拍头Patting Heads
    【题解】洛谷P1495 曹冲养猪 (中国剩余定理)
    【题解】POJ1845 Sumdiv(乘法逆元+约数和)
    【题解】P1516 青蛙的约会(Exgcd)
    【数论】同余问题
    DP Cleaning Up 打扫卫生
    set+链表 【POJ Challenge】生日礼物
    并查集 [Scoi2010]游戏
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/14798358.html
Copyright © 2020-2023  润新知