Maison >base de données >tutoriel mysql >Délai d'attente du verrouillage dépassé ; essayez de redémarrer la transaction - Comment résoudre l'erreur MySQL : délai d'attente du verrouillage, essayez de redémarrer la transaction

Délai d'attente du verrouillage dépassé ; essayez de redémarrer la transaction - Comment résoudre l'erreur MySQL : délai d'attente du verrouillage, essayez de redémarrer la transaction

WBOY
WBOYoriginal
2023-10-05 10:21:261499parcourir

Lock wait timeout exceeded; try restarting transaction - 如何解决MySQL报错:锁等待超时,尝试重新启动事务

Titre : Comment résoudre l'erreur MySQL : verrouiller le délai d'attente, essayer de redémarrer la transaction, nécessiter des exemples de code spécifiques

Texte :

MySQL est un système de gestion de bases de données relationnelles couramment utilisé et est largement utilisé dans divers types de bases de données .application. Cependant, lors de l'utilisation de MySQL, nous pouvons rencontrer diverses erreurs et exceptions. L'une des erreurs courantes est "Délai d'attente de verrouillage dépassé ; essayez de redémarrer la transaction". Cet article explique comment résoudre ce problème et fournit des exemples de code spécifiques.

  1. La raison du délai d'attente du verrouillage
    Dans MySQL, une transaction est composée d'une série d'opérations visant à maintenir la cohérence et l'intégrité de la base de données. Une transaction commence généralement par une instruction BEGIN et se termine par une instruction COMMIT ou ROLLBACK. Lorsque plusieurs transactions accèdent à la même ressource de base de données en même temps, une concurrence de verrouillage peut se produire, ce qui entraîne une attente trop longue d'une transaction pour que d'autres transactions libèrent le verrou, ce qui entraîne une erreur de délai d'attente du verrouillage.
  2. Solution
    Afin de résoudre l'erreur « Délai d'attente de verrouillage dépassé ; essayez de redémarrer la transaction », nous pouvons utiliser les méthodes suivantes :

2.1 Optimiser les instructions de requête
Dans MySQL, les instructions de requête sont l'une des opérations de base de données les plus couramment utilisées. . L'optimisation des instructions de requête peut réduire efficacement les problèmes de conflit de verrouillage. Vous pouvez essayer d'utiliser des index appropriés, réduire les opérations JOIN inutiles, réduire les analyses de table complètes et d'autres méthodes pour améliorer les performances des requêtes, réduisant ainsi le temps d'attente du verrouillage.

2.2 Limiter la durée des transactions
Des transactions plus longues augmenteront le temps de verrouillage des ressources, augmentant ainsi le temps d'attente des autres transactions pour les verrous. En limitant la durée des transactions et en divisant les transactions en unités d'opérations plus petites, les problèmes de conflits de verrouillage peuvent être réduits.

2.3 Améliorer le niveau d'isolation des transactions
MySQL prend en charge plusieurs niveaux d'isolation des transactions, tels que Lecture non validée, Lecture validée, Lecture répétable et Sérialisable. Différents niveaux d’isolement des transactions gèrent différemment la concurrence des verrous. Définir le niveau d'isolement des transactions à un niveau inférieur, tel que lecture non validée, peut réduire le temps d'attente du verrouillage.

2.4 Augmenter le délai d'attente du verrouillage
Dans MySQL, le délai d'attente du verrouillage par défaut est de 50 secondes. Si vous êtes dans un environnement à forte concurrence et que certaines opérations prennent beaucoup de temps, vous pouvez éviter l'erreur « Délai d'attente de verrouillage dépassé » en définissant le délai d'attente de verrouillage. Le délai d'attente du verrouillage peut être défini sur 100 secondes à l'aide de l'instruction SQL suivante :

SET innodb_lock_wait_timeout = 100;
  1. Exemple de code
    Voici un exemple de code qui montre comment gérer l'erreur "Délai d'attente du verrouillage dépassé" dans un programme Java :
try {
    // 建立数据库连接
    Connection connection = DriverManager.getConnection(url, username, password);
    
    // 开启事务
    connection.setAutoCommit(false);
    
    // 执行数据库操作
    // ...
    
    // 提交事务
    connection.commit();
    
} catch (SQLException e) {
    if (e.getErrorCode() == 1205) { // 锁等待超时错误码为1205
        // 尝试重新启动事务
        // ...
    } else {
        e.printStackTrace();
    }
}

Dans le code ci-dessus, nous capturons les exceptions SQL et portons des jugements basés sur les codes d'erreur. Si le code d'erreur est 1205, ce qui correspond à une erreur de délai d'attente de verrouillage, nous pouvons essayer de redémarrer la transaction.

Résumé :

Lors de l'utilisation de MySQL, vous pouvez rencontrer l'erreur « Délai d'attente de verrouillage dépassé ; essayez de redémarrer la transaction ». Afin de résoudre ce problème, nous pouvons réduire les problèmes de concurrence de verrouillage en optimisant les instructions de requête, en limitant la longueur des transactions, en améliorant le niveau d'isolation des transactions et en augmentant le délai d'attente du verrouillage. Nous fournissons également un exemple de code Java qui montre comment gérer cette erreur.

J'espère que cet article vous aidera à résoudre le problème du délai d'attente de verrouillage dans MySQL !

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