2017-04-26 193 views
0

日志显示不时出现此错误。ER_LOCK_DEADLOCK在没有锁的情况下调用

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

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

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

回答

1

每个查询都没有一个明确的交易中运行运行在一个隐含交易时,查询完成或发生错误回滚立即提交...所以,是的,你正在使用的交易。

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

错误并不是一个错误,因为它是服务器说:“我看到你做了什么,在那里......并且,不客气,我为你清理它,否则,你会等待永远。”

你没有看到的是有两个有罪的派对 - 导致问题的两个不同的问题 - 但只有其中一个被惩罚。已经完成最少工作量(当然,这个概念是模糊的)的查询将会因死锁错误而被杀死,而另一个查询则沿着它的路径快乐地前进,不知道它是幸运的幸存者。

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

https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlocks.html和检查的SHOW ENGINE INNODB STATUS;输出,它会显示你的其他查询 - 一,帮助造成的僵局,但,这不是杀 - 以及那是一个。

+0

因此,赶上这个错误是安全的,只需再次运行查询?还是将它吐回API并重新提交导致查询的整个请求更好? –

+0

立即......自己重试查询(通过将错误抛回API并再次调用者调用)应该与数据库的角度相同。 –

相关问题