2020年6月23日 作者 zeroheart

innodb的锁

行锁、间隙锁、(临键锁)nextKey locking

对于RU,RC使用的是行锁,其他的使用临键锁(防止幻读),但是对于普通的select语句,实际上是不加锁的,使用一致性非锁定读,读取快照的数据。只有显式的select *** for update 或者select *** in share mode才会加临键锁。临键锁在只使用主键索引或者唯一索引的情况下,也会退化为行锁。

InnoDB的锁定模式实际上可以分为四种:共享锁(S),排他锁(X),意向共享锁(IS)和意向排他锁(IX)

如果遇到一个共享锁正锁定着自己需要的资源的时候,自己可以再加一个共享锁,不过不能加排他锁;

但是,如果遇到自己需要锁定的资源已经被一个排他锁占有之后,则只能等待该锁定释放资源之后自己才能获取锁定资源并添加自己的锁定。

以下是相关关系:
如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
意向锁是InnoDB自动加的,不需用户干预。

对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;
自己需要的话可以显式的加锁。
这个图片的例子说明了间隙锁的工作原理。参考以下文章,也是《MySQL技术内幕 InnoDB存储引擎 》里面的例子,书里面没配图,这个清晰不少。
https://blog.csdn.net/bruceleenumberone/article/details/81865045

看到这个图,终于明白了,原来间隙锁是前后间隙都会加,并且记录本身也会加。豁然开朗了。