delete操作锁定innodb中的整个表

时间:2014-04-21 08:32:44

标签: mysql innodb deadlock

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

我无法完全重现这个死锁,但我发现锁定问题。 即我有表队列:id值(1,3,4,5,6,7)

交易1:

insert into queue value(2);

交易2:

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

1 个答案:

答案 0 :(得分:6)

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

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

如果不是这种情况那么可能是由于"间隙锁定"如上所述@a_horse_with_no_name。

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

此外,您可以避免此锁定,以便根据主键逐个删除所有行。