ER_LOCK_DEADLOCK 没有锁时调用

ER_LOCK_DEADLOCK called when there is no lock

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

我正在阅读 docs,它非常令人困惑,因为我们没有锁定任何表来执行插入操作,而且我们没有超出单个 SQL 调用的事务。

所以 - 发生这种情况可能是因为我们 运行 不在 Node 的 mySQL 连接池中? (我们已将其设置为 250 个同时连接)。

我想弄清楚如何复制它,但没有运气。

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

当至少有两个查询在获取锁的过程中时,就会发生死锁,并且每个查询都持有行级锁,而这些锁碰巧以这样的顺序获取,以至于它们现在都需要另一个锁持有的另一个锁-- 所以,它们 "deadlocked." 运行ning 查询之间存在无限等待条件。服务器注意到这一点。

这个错误与其说是错误,不如说是服务器说的,"I see what you did, there... and, you're welcome, I cleaned it up for you because otherwise, you would have waited forever."

您没有看到的是,有两个有罪的一方——两个不同的查询导致了问题——但只有其中一个受到了惩罚。完成最少工作量的查询(诚然,这个概念是模糊的)将因死锁错误而被杀死,而另一个查询愉快地沿着它的路径前进,不知道它是幸运的幸存者。

这就是死锁错误消息以 "try restarting transaction" 结尾的原因——如果您没有明确使用 transacrions,则意味着 "run your query again."

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