Domanda

So che i deadlock si verificano inevitabilmente quando si utilizzano le transazioni in Innodb e che sono innocui se trattati correttamente dal codice dell'applicazione - "riprovare", come dice il manuale.

Quindi mi chiedevo: come si rilevano i deadlock? Un deadlock genera un numero di errore mysql speciale? Sto usando l'estensione mysqli di PHP se è importante.

Grazie.

Modifica: soluzione trovata, vedi commenti

È stato utile?

Soluzione

http://dev.mysql.com/ doc / refman / 5.0 / it / InnoDB-error-codes.html

  

1213 (ER_LOCK_DEADLOCK)

     

Deadlock della transazione. Dovresti rieseguire   la transazione.

Altri suggerimenti

" MOSTRA STATO INNODB MOTORE " dal client della riga di comando di MySQL (non un browser di query) fornirà informazioni sui deadlock.

I deadlock possono anche essere causati da transazioni non impegnate (di solito bug del programma) e la persona che sta eseguendo la transazione non impegnata non vedrà il problema in quanto funzionerà bene (attraverso i suoi dati non verrà eseguito il commit).

Prova MaatKit . Ha un logger deadlock.

Prova a utilizzare MONyog . Abilita il monitoraggio deadlock di MONyog " opzione per tracciare i deadlock segnalati da INNODB STATUS. MONyog invierà un avviso all'utente quando si verifica un nuovo deadlock. inserisci qui la descrizione dell'immagine

Prova innotop, rileverà il deadlock per te.

Se sei su un mac:

$ brew install percona-toolkit

$ pt-deadlock-logger -uroot --ask-pass localhost

Di recente ho creato un controllo molto semplice per i deadlock per l'implementazione di un test del fumo di un'applicazione Web. Il codice può essere migliorato molto, ma per ora funziona. Vedi https://dev.mysql.com/doc /refman/8.0/en/innodb-standard-monitor.html per ulteriori informazioni sull'output della query utilizzata di seguito.

$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;

if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
  trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}

if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
  trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top