mysql InnoDB下的锁 next-key locking

两个标准的行级锁:

共享锁(S Lock): 允许事务读一行数据

排他锁(X Lock):允许事务删除或更新一行数据。

 

表级别锁(意向锁):

意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁。

意向排他锁(IX Lock), 事务想要获得一张表中某几行的排他锁。

 

 

InnoDB存储引擎有3中行锁的算法:

  1. Record Lock:单个行记录上的锁
  2. Gap Lock : 间隙锁,锁定一个范围,但不包含记录本身。
  3. Next--Key Lock : Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身。

Record Lock总是会去锁住一索引记录

InnoDB对于行的查询都是采用这种锁定算法。

InnoDB存储引擎采用Next-Key Locking机制来避免Phanton Problem(幻想问题)。

InnoBD在REPEATABLE READ隔离级别下,采用Next-Key Locking的方式加锁;

在READ COMMITTED下,其仅采用Record Lock

 

Gap Lock的作用是为了阻止多个事务将记录插入到同一个范围内,这会导致幻读问题

在next-key lock算法下,对于索引的扫描,不仅是锁住扫描到的索引,而且还锁住这些索引覆盖的范围(gap)。因此在这个范围内的插入都是不允许的。

只有当查询的索引含有唯一索引时,InnoDB存储引擎会对Next-key Lock进行优化,将其降级到Record Lock,及仅仅锁住索引本身,而不是范围。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值