Maison >base de données >tutoriel mysql >Comment résoudre les erreurs « Délai d'attente de verrouillage dépassé » de MySQL ?

Comment résoudre les erreurs « Délai d'attente de verrouillage dépassé » de MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-09 13:03:10426parcourir

How to Resolve MySQL's

Comment déboguer les erreurs « Délai d'attente de verrouillage dépassé » dans MySQL ?

Lorsque vous rencontrez des erreurs « Délai d'attente de verrouillage dépassé » dans les journaux MySQL, cela indique une transaction en attente pour un verrou sur un élément de base de données. Même si vous savez quelle requête tente d'accéder à la base de données, déterminer quelle requête détient le verrou à ce moment précis peut être difficile.

Identifier le coupable

La présence du mot « transaction » dans le message d'erreur suggère que la requête problématique implique la modification d'au moins une ligne dans une ou plusieurs tables InnoDB. Puisque vous avez accès à la requête à l'origine des erreurs, vous pouvez déterminer à quelles tables vous accédez, car elles sont des coupables potentiels.

À l'aide de SHOW ENGINE INNODB STATUSG

Pour approfondir vos recherches, exécutez la commande suivante command :

SHOW ENGINE INNODB STATUS\G

Cela fournira des informations sur les verrous et les mutex, y compris :

  • Tables concernées
  • Tours de verrouillage partagés RW
  • Tours de verrouillage exclusifs RW
  • Attentes de rotation Mutex
  • Informations sur le verrouillage des lignes
  • Annuler le journal entrées

Exemple de sortie

Par exemple, la sortie suivante d'un client illustre le problème.

Type: InnoDB
Name:
Status:

=====================================
110514 19:44:14 INNODB MONITOR OUTPUT
=====================================

Per second averages calculated from the last 4 seconds
----------
SEMAPHORES
----------

Mutex spin waits 0, rounds 11487096053, OS waits 7756855

RW-shared spins 722142, OS waits 211221; RW-excl spins 787046, OS waits 39353

------------------------
LATEST FOREIGN KEY ERROR
------------------------

110507 21:41:35 Transaction:
TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499
mysql tables in use 1, locked 1

14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1

MySQL thread id 3686635, query id 124164167 10.64.89.145 viget updating
DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' )

...

Dans cette sortie, la table "fichier" apparaît être la table affectée, car la requête DELETE tente de modifier les lignes de cette table. En analysant le résultat, vous pouvez identifier la table spécifique à l'origine du conflit de verrouillage.

Augmentation du délai d'attente du verrouillage

Pour éviter de rencontrer ces erreurs à l'avenir, envisagez d'augmenter le délai d'attente du verrouillage. valeur pour InnoDB en définissant le paramètre innodb_lock_wait_timeout. La valeur par défaut est de 50 secondes.

Pour augmenter le délai d'expiration de manière permanente, ajoutez la ligne suivante à votre fichier /etc/my.cnf :

[mysqld]
innodb_lock_wait_timeout=120

Vous pouvez également ajuster le délai d'expiration temporairement au cours de la session en cours :

SET innodb_lock_wait_timeout = 120;

L'augmentation du délai d'attente accordera à la transaction en attente plus de temps pour acquérir le verrou, réduisant ainsi le risque d'expiration du délai d'attente. erreurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn