Description du problème
Une attente de verrou de ligne se produit lorsqu’une session attend un verrou exclusif sur une ligne détenu par une autre session. Un délai d’attente de verrou expiré renvoie l’erreur suivante :
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Causes
En temps normal, la session qui détient le verrou exclusif sur la ligne termine rapidement ses opérations et libère le verrou via un commit ou un rollback de transaction. La session en attente acquiert alors le verrou avant l’expiration du délai et poursuit son opération. Toutefois, il arrive qu’une session conserve un verrou exclusif sur une ligne pendant une durée prolongée. Cela peut se produire si la session de base de données d’une application cliente est interrompue sans que l’instance ne le détecte. Si d’autres sessions demandent ensuite le même verrou, de nombreuses attentes de verrou et expirations de délai se produisent.
Solutions
Les méthodes présentées dans cette rubrique s’appliquent uniquement lorsqu’une attente de verrou de ligne est active. Le délai d’expiration par défaut de l’attente de verrou dans RDS for MySQL est de 50 secondes. Il est donc difficile d’observer une attente de verrou en direct. Vous pouvez reproduire le problème en définissant le paramètre innodb_lock_wait_timeout sur une valeur élevée. Cependant, n’utilisez pas de valeur élevée pour innodb_lock_wait_timeout dans un environnement de production.
Connectez-vous à une instance RDS for MySQL à l’aide de DMS.
-
Consultez les transactions actuelles et celles qui sont en attente de verrous.
-
Exécutez l’instruction SQL suivante pour afficher les transactions en cours d’exécution :
SELECT * FROM information_schema.INNODB_TRX; -
Exécutez l’instruction SQL suivante pour afficher les transactions en attente de verrous :
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; -
Exécutez l’instruction SQL suivante pour afficher les verrous détenus par les transactions :
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-
Une session identifiée comme bloqueuse détient un verrou qui empêche les opérations de langage de manipulation de données (DML) des autres sessions, ce qui provoque des attentes de verrou de ligne et des expirations de délai. Si vous confirmez qu’un rollback de transaction est acceptable pour la session bloqueuse, mettez fin à la session.
Si le problème persiste, consultez la rubrique Blocage des verrous pour savoir comment utiliser la page des statistiques de blocage des verrous afin de localiser rapidement la session à l’origine du blocage prolongé et consulter ses détails.
S’applique à
ApsaraDB RDS for MySQL