1

偶尔我得到一个mysql错误。错误是

Deadlock found when trying to get lock; try restarting transaction

查询是

var res = cn.Execute("insert ignore into 
    Post(desc, item_id, user, flags)
    select @desc, @itemid, @userid, 0", 
    new { desc, itemid, userid });

这个查询到底是怎么引起的?谷歌搜索时,我看到了一些关于如何使用长锁定行并导致此问题的查询,但此插入不需要触及任何行

4

1 回答 1

5

死锁是由事务间排序和锁获取引起的。通常每个连接有一个活动事务(尽管不同的数据库可能工作方式不同)。因此,只有在多个连接以及多个重叠事务的情况下才会发生死锁。单个连接/事务不能自行死锁,因为没有它无法获取的锁:它拥有它,或者它可以获得它。

插入死锁可能是由唯一约束引起的- 因此检查唯一键约束是否是罪魁祸首。其他原因可能是为选择“for update”语句等而持有的锁。

此外,确保所有事务在需要它们的操作之后立即完成(提交或回滚)。如果事务没有及时关闭,它可能会导致这种死锁行为。虽然“自动提交”通常会处理此问题,但它可以更改且不应依赖:我建议正确使用手动事务。

有关更多信息,请参阅需要的 Mysql 死锁解释如何应对死锁。在这种情况下,“再试一次”可能就足够了。

于 2013-02-16T19:52:39.967 回答