Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Techniques informatiques

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

Créé le 02/04/2014 , dern. modif. le 03/01/2019

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.
Quillevere.net

Commentaires

Aucune inscription n'est requise si vous souhaitez

Rechercher sur le site

fr en rss RSS info Informations