数据库考点_10

next-key锁(行锁 + gap锁)

行锁

行锁: 即record lock,指对单个行记录上的锁.

gap锁

gap lock(间隙锁): 表示锁定一个范围,但不包括记录本身.
其主要目的是为了防止同一事务的两次当前读出现幻读的情况.
它在RC及RU隔离级别中是没有的,在RR以及串行化中默认支持,这就是为啥RC和RU无法避免幻读的原因.

这里主要讨论RR隔离级别下gap锁出现的场景
RR隔离级别下对主键索引或者唯一索引会用gap锁吗

视情况而定

  1. 如果where条件全部命中(理解为精确查找的时候,所有记录都有),则不会用gap锁,只会加记录锁(行锁).
    例如: select * from user where id in (1,2,3),如果id为1,2,3的数据在数据库中全部都有,那么不会加gap锁,如果只有一部分,那么就会加.
    此时不会出现幻读现象,因为精确查询的数据在数据库中都有,事务B的新增操作一定在当前读的范围之外,所以事务B新增数据并提交之后,事务A再去做当前读,还是获取到原先的数据集.
  2. 如果where条件部分命中或者全不命中,则会加gap锁.

gap锁用在走非唯一索引或者不走索引的当前读中

当前读走非唯一索引的情况,如图(图中的gap表示所有可能的区间):
图中id为非唯一键,如果没有加gap锁的话,会出现幻读.
比如我们执行删除id索引值为9的两列,但是不提交
如果没有gap锁的话,我们此时在事务B中再插入id为9的数据,应该会成功
但是实际上是不成功的,它会等待事务A中删除语句提交或者回滚再执行.

它此时会给id= 9的周边都上gap锁,本例中gap锁的范围是:(6, 11],对范围外的数据进行更新是可以成功的.
在这里插入图片描述

当前读不走索引的情况,如图:

当前读不走索引的时候,它会对所有的gap都上锁,类似于表锁的效果,不过比表锁的开销更大,因为他是一段一段锁的.
在这里插入图片描述

总结

InnoDB通过引入next-key锁来避免幻读问题
而next-key由record lock和gap lock组成.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值