In primo luogo, i deadlock non dipendono dal blocco esplicito. NON è necessario che la LOCK TABLE di MySQL o l'utilizzo di modalità di isolamento delle transazioni non predefinite abbiano un deadlock. Puoi comunque avere deadlock se non utilizzi mai una transazione esplicita.
I deadlock possono verificarsi su un singolo tavolo, abbastanza facilmente. Più comunemente proviene da una singola tavola calda.
I deadlock possono anche succede se tutte le tue transazioni eseguono solo un inserimento di una singola riga.
Se hai
può verificarsi un deadlock- Più di una connessione al database (ovviamente)
- Qualsiasi operazione che coinvolge internamente più di un blocco.
Ciò che non è ovvio è che la maggior parte delle volte un inserimento o un aggiornamento di una singola riga implica più di un blocco. Il motivo è che anche gli indici secondari devono essere bloccati durante gli inserimenti/aggiornamenti.
I SELECT non si bloccheranno (supponendo che tu stia utilizzando la modalità di isolamento predefinita e non utilizzi FOR UPDATE), quindi non possono essere la causa.
SHOW ENGINE INNODB STATUS è tuo amico. Ti fornirà un sacco di informazioni (certamente molto confuse) sui deadlock, in particolare quello più recente.
- Non puoi eliminare completamente i deadlock, continueranno a verificarsi in produzione (anche sui sistemi di test se li stressi adeguatamente)
- Mira a una quantità molto bassa di deadlock. Se l'1% delle tue transazioni si blocca, forse è troppo.
- Considera la possibilità di modificare il livello di isolamento delle tue transazioni in read-commit SE COMPRENDI COMPLETAMENTE LE IMPLICAZIONI
- assicurati che il tuo software gestisca i deadlock in modo appropriato.