Se stai utilizzando InnoDB o qualsiasi RDBMS transazionale a livello di riga, è possibile che qualsiasi la transazione di scrittura può causare un deadlock, anche in situazioni perfettamente normali. Tabelle più grandi, scritture più grandi e blocchi di transazione lunghi spesso aumenteranno la probabilità che si verifichino deadlock. Nella tua situazione, è probabilmente una combinazione di questi.
L'unico modo per gestire veramente i deadlock è scrivere il codice per aspettarseli. Questo generalmente non è molto difficile se il codice del database è ben scritto. Spesso puoi semplicemente inserire un try/catch
attorno alla logica di esecuzione della query e cercare un deadlock quando si verificano errori. Se ne catturi uno, la cosa normale da fare è semplicemente tentare di eseguire nuovamente la query non riuscita.
Consiglio vivamente di leggere questa pagina nel manuale MySQL. Ha un elenco di cose da fare per affrontare i deadlock e ridurne la frequenza.