这是一个非常简单的问题,但我真的在谷歌上找不到任何有用的答案。
我一直在读到 SELECT 上有一个 READ LOCK,而 UPDATE 语句上有一个 WRITE LOCK。但是,我试图找出当我们插入表时是否有任何类型的 LOCK?
假设该表使用 InnoDB 作为引擎。
插入时,InnoDB 会创建一个所谓的“间隙锁”。
一种称为插入意图间隙锁的间隙锁由插入操作在行插入之前设置。该锁表示插入的意图,即如果插入到同一索引间隙中的多个事务没有在间隙内的同一位置插入,则它们不需要相互等待。假设有值为 4 和 7 的索引记录。尝试插入值 5 和 6 的单独事务在获得插入行的排他锁之前,每个使用插入意图锁锁定 4 和 7 之间的间隙,但不互相阻塞,因为行不冲突
除此之外,将为提供的值锁定任何唯一索引,以确保两个不同的事务不会插入相同的值(如果我没记错的话,这与间隙锁定略有不同)。
对于 innoDB mysql 使用行级锁定。插入时没有要锁定的行,因为您正在创建它。
添加到间隙锁描述中,Mysql INNODB 对正在插入的行执行 ROW-LOCK。