为什么mysql在这里死锁?

时间:2013-02-16 19:00:36

标签: mysql

有一段时间我得到一个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 });

这个查询究竟是如何导致它的?当谷歌搜索我看到一些关于如何查询需要长锁定行并导致此问题,但没有需要触摸此插入行

1 个答案:

答案 0 :(得分:3)

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

插入死锁可以be caused by a unique constraint - 所以检查一个唯一的键约束作为罪魁祸首。其他原因可能是为选择“更新”语句等而持有的锁。

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

有关详细信息,请参阅Mysql deadlock explanation neededHow to Cope with Deadlocks。在这种情况下,“再试一次”就足够了。