Maison >base de données >tutoriel mysql >Comment résoudre les erreurs « Délai d'attente de verrouillage dépassé » de 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.
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.
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 :
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.
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!