没有锁定时调用ER_LOCK_DEADLOCK

时间:2017-04-26 05:12:26

标签: mysql node.js mysql-error-1064 rds

日志显示有时会出现此错误。

我正在阅读docs并且它非常令人困惑,因为我们没有锁定任何表来执行插入操作,除了单独的SQL调用之外我们没有任何事务处理。

所以 - 可能会发生这种情况,因为我们已经在Node中的mySQL连接池中耗尽了吗? (我们将其设置为250个同时连接)。

我试图弄清楚如何复制这个但没有运气。

1 个答案:

答案 0 :(得分:4)

未在显式事务中运行的每个查询都在隐式事务中运行,该事务在查询完成时立即提交或在发生错误时回滚...所以,是的,你正在使用交易。

当获取锁定的过程中至少有两个查询时会发生死锁,并且每个查询都拥有它们碰巧以这样的顺序获取的行级锁定,以至于它们现在都需要另一个锁定而另一个锁定 - 所以,他们“陷入僵局”。正在运行的查询之间存在无限等待条件。服务器注意到了这一点。

这个错误并不是一个错误,因为它是服务员说的,“我看到你做了什么,那里......而且,欢迎你,我为你清理它,否则,你会永远等待。“

你没有看到的是,有两个有罪的派对 - 导致问题的两个不同的问题 - 但只有一个受到惩罚。已完成最少量工作的查询(不可否认,这个概念是模糊的)将被死锁错误杀死,另一个查询很快就沿着它的路径前进,不知道它是幸运的幸存者。

这就是死锁错误消息以“尝试重启事务”结束的原因 - 如果您没有明确使用transacrions,则只是意味着“再次运行您的查询。”

请参阅https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlocks.html并检查SHOW ENGINE INNODB STATUS;的输出,它将显示另一个查询 - 帮助导致死锁但未被杀死的查询 - 以及那个查询