请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

未使用索引和使用索引未命中,老师能不能统一回答下

  1. 未使用索引时,加的是行锁(每一行都加锁)?还是行锁(每一行都加锁)和gap锁?还是表锁?

  2. 使用索引但未命中时,加的是行锁(每一行都加锁)和gap锁?

老师能回答下吗?我看有其它同学也问了类似的问题。但是写的太多了。没太整明白。

正在回答

1回答

翔仔 2019-09-18 01:30:06

同学好,innodb的话

  1. 不走索引的时候,走的是表锁(插入除外,插入会有插入意向锁,该锁在insert操作时产生。在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待。
    假设有一个记录索引包含键值4和7,不同的事务分别插入5和6,每个事务都会产生一个加在4-7之间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。)

  2. 使用索引未命中,就是next-key锁,也就是行锁(每一行都加锁)和gap锁

0 回复 有任何疑惑可以回复我~
  • 提问者 慕粉13951610073 #1
    不走索引的时候,,老师说的表锁
    RC模式下,表锁=全表行锁
    RR模式下,表锁=全表行锁+gap锁
    老师我理解的有问题吗,我测试了一下好像是这样的。
    回复 有任何疑惑可以回复我~ 2019-09-18 10:55:04
  • 翔仔 回复 提问者 慕粉13951610073 #2
    同学好,这个表锁我理解在不同模式下表示的行为不同,但是具体实现不是逐行加锁或者用gap锁这么粗暴,mysql官方文档上的原话是说innodb支持表锁和行锁,也就是说它是可以锁表的,因此它的表锁实现虽然不像myisam,也不是简单地组合行锁和gap锁,是有它自己的实现逻辑的,具体需要看源码领悟才可以:)
    回复 有任何疑惑可以回复我~ 2019-09-18 23:42:37
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信