有一段时间我得到一个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 });
这个查询究竟是如何导致它的?当谷歌搜索我看到一些关于如何查询需要长锁定行并导致此问题,但没有需要触摸此插入行
答案 0 :(得分:3)
死锁是由事务间排序和锁定获取引起的。通常每个连接有一个活动事务(尽管不同的数据库可能以不同的方式工作)。因此,仅在多个连接的情况下,因此多个重叠事务才会发生死锁。单个连接/事务本身不会死锁,因为它没有锁定它无法获取:它有它,或者它可以获得它。
插入死锁可以be caused by a unique constraint - 所以检查一个唯一的键约束作为罪魁祸首。其他原因可能是为选择“更新”语句等而持有的锁。
此外,确保在需要它们的操作之后立即完成(提交或回滚)所有事务。如果事务未及时关闭,则可能导致此类死锁行为。虽然"autocommit"通常会处理此问题,但可以更改它,不应该依赖它:我建议使用适当的手动事务。
有关详细信息,请参阅Mysql deadlock explanation needed和How to Cope with Deadlocks。在这种情况下,“再试一次”就足够了。