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

  1. Record Lock:记录锁,单个行记录上的锁。
  2. Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。
  3. 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的数据,便会被阻塞。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值