Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Réflexions informatiques

Erreur "Deadlock found when trying to get lock; try restarting transaction"

02/04/2014

Si plusieurs transactions sont exécutées en même temps et font des blocages de lignes ou de tables, on peut obtenir l'erreur MySQL "Deadlock found when trying to get lock;  try restarting transaction". Il y a plusieurs manipulations pour examiner l'origine du verrou.

Pour lister le dernier deadlock qui s'est produit, lancer la commande suivante sur la base de données MySQL :
SHOW ENGINE INNODB STATUS

Pour afficher les verrous en cours, lors de l'exécution de la transaction :
SHOW FULL PROCESSLIST;

Pour plus de précision, on peut demander à MySQL de tracer toutes les requêtes. Il faut ouvrir le fichier mysql.ini et ajouter les lignes suivantes :
general_log=1
log-output=TABLE

A ce moment-là, les requêtes sont inscrites dans la table mysql.general_log et on peut la filtrer pour retrouver les requêtes lancées. Voici un exemple :
SELECT
(CASE WHEN thread_id=690 THEN "x" ELSE "" END) AS c690,
(CASE WHEN thread_id=708 THEN "x" ELSE "" END) AS c708,
event_time, user_host, thread_id, argument
FROM mysql.general_log
WHERE
  (thread_id IN (690,708))
  AND (argument LIKE "INSERT%" OR argument LIKE "UPDATE%" OR argument LIKE "DELETE%")
  AND event_time >= now() - INTERVAL 1 HOUR  
ORDER BY event_time ASC

Cette requête va lister toutes les requêtes INSERT/DELETE/UPDATE des threads 690 et 708, lancées il y a moins d'une heure.
Autre chose à savoir : les requêtes, selon leur syntaxe, peuvent bloquer toute une table ou un ensemble de ligne. Ainsi,
UPDATE tb SET a=1 WHERE b=2
bloquera un seul enregistrement de la table si b est un index et tous les enregistrements de la table dans le cas contraire.
Dernière modification le 29/06/2019 - Quillevere.net

Rechercher sur le site

rss RSS info Informations