Jeśli używasz InnoDB lub dowolnego transakcyjnego RDBMS na poziomie wiersza, możliwe jest, że dowolny transakcja zapisu może spowodować zakleszczenie, nawet w całkowicie normalnych sytuacjach. Większe tabele, większe zapisy i długie bloki transakcji często zwiększają prawdopodobieństwo wystąpienia zakleszczeń. W Twojej sytuacji jest to prawdopodobnie połączenie tych dwóch elementów.
Jedynym sposobem, aby naprawdę poradzić sobie z zakleszczeniami, jest napisanie kodu tak, aby się ich spodziewał. Generalnie nie jest to trudne, jeśli kod bazy danych jest dobrze napisany. Często wystarczy umieścić try/catch
wokół logiki wykonywania zapytania i poszukaj zakleszczenia, gdy wystąpią błędy. Jeśli je złapiesz, normalną rzeczą do zrobienia jest po prostu próba ponownego wykonania nieudanego zapytania.
Gorąco polecam przeczytanie tej strony w instrukcji MySQL. Zawiera listę rzeczy, które można zrobić, aby poradzić sobie z impasami i zmniejszyć ich częstotliwość.