SQL INSERT 是否涉及读/写锁?

use*_*233 1 mysql locking insert

这是一个非常简单的问题,但我在谷歌上确实找不到任何有用的答案。

我一直在读到 SELECT 上有一个 READ LOCK,而 UPDATE 语句上有一个 WRITE LOCK。但是,我试图找出当我们插入表时是否有任何类型的锁?

假设该表使用 InnoDB 作为引擎。

小智 5

插入时,InnoDB 会创建一个所谓的“间隙锁”。

该手册对此进行了很好的描述

一种称为插入意向间隙锁的间隙锁是由 INSERT 操作在行插入之前设置的。此锁表明插入的意图是,插入同一索引间隙的多个事务如果没有插入间隙内的同一位置,则无需互相等待。假设存在值为 4 和 7 的索引记录。尝试插入值 5 和 6 的单独事务在获得插入行上的排他锁之前,每个事务都使用插入意向锁锁定 4 和 7 之间的间隙,但不这样做互相阻塞,因为行不冲突

除此之外,任何唯一索引都将被锁定以获取所提供的值,以确保两个不同的事务不会插入相同的值(如果我没有记错的话,这与间隙锁略有不同)。