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

来源:3-17 锁模块之RR如何避免幻读

慕粉13951610073

2019-09-17

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

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

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

写回答

1回答

翔仔

2019-09-18

同学好,innodb的话

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

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

0
2
翔仔
回复
慕粉13951610073
同学好,这个表锁我理解在不同模式下表示的行为不同,但是具体实现不是逐行加锁或者用gap锁这么粗暴,mysql官方文档上的原话是说innodb支持表锁和行锁,也就是说它是可以锁表的,因此它的表锁实现虽然不像myisam,也不是简单地组合行锁和gap锁,是有它自己的实现逻辑的,具体需要看源码领悟才可以:)
2019-09-18
共2条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程