InnoDB是行锁还是表锁取决于SQL语句,行锁是实现在索引上的,而不是锁在物理行记录上,如果没有命中索引,则退化为表锁。行锁不容易被发现,比较狡猾,因为它超时时间是50秒,可以通过ER_LOCK_WAIT_TIMEOUT EXCEEDED错误发现。发生原因有select for update,lock for share,lock in share等。
间隙锁是为了解决幻读,事务隔离级别是可重复读的情况,比如slect from where id >10 and id<20 for update,但是比更新id=12会失败,因为12正好在这个区间里面。
next-key lock相当于行锁加上间隙锁,还是上面的情况它包含(无穷小,10),(10,20),[20,无穷大)所有区间。
在rc(read committed)事务模式下,间隙锁gap lock的粒度要比rr事务模式下锁的粒度小的多,当事务是rc时,间隙锁只锁住(-∞,5),行锁是id=5,而在事务是rr时,间隙锁是(-∞,5),(5,∞),范围更大,并发性能降低。next-key锁是行锁和间隙锁的组合,只有在事务是rr时才生效,是(-∞,5],(5,∞)。