关于MySQL中的锁的理解和间隙锁生效情况

对各种锁的理解

  • 乐观锁、悲观锁是概念,是两种并发控制策略,并不是具体的锁的类型。

  • 行锁、表锁是锁的粒度(可以理解为作用范围)。

  • 共享锁 (S锁 / SHARE MODE)、排他锁 (X锁 / FOR UPDATE)、间隙锁 (Gap Lock)是确定的锁的类型。

  • 意向锁是特殊的锁,由存储引擎管理。

加锁的流程

锁是加在数据上的,事务向存储引擎申请锁,存储引擎根据事务隔离级别等信息向管理的数据加不同类型和粒度的锁。

不同索引情况的间隙锁生效情况

间隙锁是基于索引的,对一定范围的索引,锁定索引之间的间隙,不让其他事务向其中插入数据。

如果表中没有索引 (甚至没有主键和UNIQUE) ,那么间隙锁会退化为表锁 (整表加锁) ,因为无法通过索引确定具体的间隙。

如果只有主键,那么间隙锁会根据主键索引加锁;如果有多个索引,根据查询条件及其使用的索引来决定间隙锁。

对于InnoDB,如果表没有主键,会隐式加入row_id作为聚簇索引,基于这个索引加锁,但在表现上还是表锁。