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)
首先假设id是主键或至少是索引列.
插入不应该锁定表,因此在删除记录的同时可能正在执行任何其他更新/删除查询.
如果不是这种情况,那么可能是由于@a_horse_with_no_name提到的"间隙锁定".
所以,当你再次遇到这个问题时,你需要在你的最后存储所有进程"显示完整的进程列表",并检查"show engine innodb status",它将显示与死锁相关的进程,这将帮助你获得准确的问题.
此外,您可以避免此锁定以基于主键逐个删除所有行.
| 归档时间: |
|
| 查看次数: |
13189 次 |
| 最近记录: |