2017-04-26 130 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並再次調用者調用)應該與數據庫的角度相同。 –

相關問題