Question

Je sais que des blocages se produisent inévitablement lors de l’utilisation de transactions dans Innodb et qu’elles sont sans danger si elles sont traitées correctement par le code de l’application - "essayez à nouveau," comme le dit le manuel.

Je me demandais donc: comment détecter les impasses? Un interblocage génère-t-il un numéro d'erreur mysql spécial? J'utilise l'extension mysqli de PHP si cela compte.

Merci.

Modifier: solution trouvée, voir les commentaires

Était-ce utile?

La solution

http://dev.mysql.com/ doc / refman / 5.0 / fr / innodb-error-codes.html

  

1213 (ER_LOCK_DEADLOCK)

     

Impasse sur la transaction. Tu devrais recommencer   la transaction.

Autres conseils

"SHOW ENGINE INNODB STATUS" depuis le client en ligne de commande MySQL (et non un navigateur de requêtes) vous donnera des informations sur les blocages.

Les impasses peuvent également être causées par des transactions non validées (généralement des erreurs de programme) et la personne qui exécute la transaction non validée ne verra pas le problème car elle fonctionnera correctement (ses données ne seront pas validées).

Essayez MaatKit . Il a un enregistreur de blocage.

Essayez d’utiliser MONyog . Activer le "Suivi des blocages" de MONyog possibilité de retrouver les blocages signalés par INNODB STATUS. MONyog envoie une alerte à l'utilisateur lorsqu'un nouvel interblocage se produit. entrer la description de l'image ici

Essayez innotop, détectera l’impasse pour vous.

Si vous êtes sur un Mac:

$ brew install percona-toolkit

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

J'ai récemment créé une vérification très simple des impasses pour la mise en œuvre d'un test de détection de la fumée d'une application Web. Le code peut être beaucoup amélioré, mais cela fonctionne pour le moment. Voir https://dev.mysql.com/doc /refman/8.0/en/innodb-standard-monitor.html pour plus d’informations sur le résultat de la requête utilisée ci-dessous.

$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");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top