delete操作锁定innodb中的整个表

Vad*_*aev 9 mysql deadlock innodb

我在InnoDB中有关于删除操作的表锁定问题.我有一个表队列,例如一列和许多事务,可以将行插入此队列或删除它们.没有任何两个事务同时使用相同的行.因此,所有行锁必须是不同的.但有时当删除操作删除表中的大部分行时,InnoDB更喜欢使用表锁而不是行锁,这会导致死锁.

我无法准确地重现这个死锁,但我发现了锁定问题.即我有表队列:id值(1,3,4,5,6,7)

交易1:

insert into queue value(2);
Run Code Online (Sandbox Code Playgroud)

交易2:

delete from queue where id in (1,3,4,5,6,7); -- here the lock comes
Run Code Online (Sandbox Code Playgroud)

Zaf*_*lik 6

首先假设id是主键或至少是索引列.

插入不应该锁定表,因此在删除记录的同时可能正在执行任何其他更新/删除查询.

如果不是这种情况,那么可能是由于@a_horse_with_no_name提到的"间隙锁定".

所以,当你再次遇到这个问题时,你需要在你的最后存储所有进程"显示完整的进程列表",并检查"show engine innodb status",它将显示与死锁相关的进程,这将帮助你获得准确的问题.

此外,您可以避免此锁定以基于主键逐个删除所有行.