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的数据,便会被阻塞。

原文地址:https://www.cnblogs.com/zyh-s/p/13253670.html