• mysql Innodb 三种行锁(记录锁、间隙锁与临键锁)


    Record Lock:记录锁,单个行记录上的锁。
    Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。
    Next-Key Lock:临键锁,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,可以解决幻读的问题。


    什么是幻读?


    事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交,然后待事务A再次进行查询时发现数据与第一次不匹配。Serializable隔离级别也可以解决幻读问题,虽然实现简单,数据更加安全,但是并发能力非常差,不推荐。突然又想到事务隔离级别,下次再说。

    记录锁:
    记录锁就是为某行记录加锁,列必须为唯一索引列或主键列,否则加的锁就会变成临键锁,
    查询语句必须为精准匹配 = ,不能为 >、<、like等,否则也会退化成临键锁。

    间隙锁:
    间隙锁基于非唯一索引,它锁定一段范围内的索引记录。比如查询字段区间为1-5,即1-5内的记录行都会被锁住,2、3、4 的数据行的会被阻塞,但是 1 和 5 两条记录行并不会被锁住。

    临键锁:
    临键锁可以理解为一种特殊的间隙锁,上面说过了通过临建锁可以解决幻读的问题。 每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。

    假设某表age字段下有:5,10,15,20

    该表中 age列潜在的临键锁有:
    (-∞, 5],
    (5, 10],
    (10, 15],
    (15, 20],
    (20, +∞],

    在事务 A 中修改年龄为5的记录。之后如果在事务 B 中执行插入年龄为8的数据,便会被阻塞。

  • 相关阅读:
    【LOJ】#2071. 「JSOI2016」最佳团体
    【LOJ】#2070. 「SDOI2016」平凡的骰子
    【LOJ】#2069. 「SDOI2016」齿轮
    【LOJ】#2068. 「SDOI2016」探险路线
    【LOJ】#2067. 「SDOI2016」硬币游戏
    【LOJ】#2066. 「SDOI2016」墙上的句子
    【LOJ】#2065. 「SDOI2016」模式字符串
    【LOJ】#2064. 「HAOI2016」找相同字符
    【LOJ】#2063. 「HAOI2016」字符合并
    【LOJ】#2062. 「HAOI2016」地图
  • 原文地址:https://www.cnblogs.com/zyh-s/p/13253670.html
Copyright © 2020-2023  润新知