Mysql
 sql >> Database >  >> RDS >> Mysql

Spiega una situazione di stallo inspiegabile

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.