web-dev-qa-db-fra.com

Comment éviter le délai d'attente de verrouillage dépassé l'exception?

    Java.sql.SQLException: Lock wait timeout exceeded; try restarting tra
nsaction at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:956)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.Java:3558)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.Java:3490)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.Java:1959)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.Java:2109)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.Java:2648)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
va:2077)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.Java:
2228)
        at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.Java:
208)
        at org.hibernate.loader.Loader.getResultSet(Loader.Java:1812)
        at org.hibernate.loader.Loader.doQuery(Loader.Java:697)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Lo
ader.Java:259)
        at org.hibernate.loader.Loader.loadEntity(Loader.Java:1885)
        ... 131 more

Le délai de verrouillage répété a dépassé l'exception pendant la mise à jour des enregistrements.

J'utilise la configuration Hibernate de Java Struts 2.1 . DB utilisé est MYSQL.

Quelqu'un sait comment le résoudre .. ??

14
Dileep

Voici quelques suggestions:

  1. "Verrouillage du délai d'attente" se produit généralement lorsqu'une transaction attend des lignes de données à mettre à jour qui ont déjà été verrouillées par une autre transaction. 
  2. La plupart du temps, le problème réside dans la base de données. Les causes possibles peuvent être une conception de table inappropriée, une grande quantité de données, des contraintes, etc. 
  3. S'il vous plaît vérifier cette réponse élaborée .
14
Santosh

Assurez-vous que les tables de base de données utilisent le moteur de stockage InnoDB et le niveau d'isolation de transaction READ-COMMITTED.

Vous pouvez le vérifier avec SELECT @@GLOBAL.tx_isolation, @@tx_isolation; sur la console mysql.

S'il n'est pas configuré pour être READ-COMMITTED, vous devez le définir. Avant de le configurer, assurez-vous que vous avez les privilèges SUPER dans mysql.

Vous pouvez obtenir de l'aide depuis http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html .

En réglant cela, je pense que votre problème sera résolu.

Je vous remercie.

5
Ravi Chhatrala

Cela pourrait aussi être causé par une mauvaise utilisation de l'annotation suivante, comme dans l'article this StackOverflow:

@Transactional(propagation = Propagation.REQUIRES_NEW)
3
martoncsukas

(Ignorant respectueusement les réponses spécifiques à la base de données)

Lorsque vous utilisez un schéma formel CRUD avec tout le trafic de base de données acheminé via une classe Singleton, vous pouvez toujours rencontrer le blocage de threads. Cela est souvent dû à un oubli entre vous, un collège et l'équipe d'Hibernate. Par conséquent, il est plus rapide d'examiner votre propre code pour détecter les bogues, en accordant une attention particulière aux règles fondamentales d'hibernate.

Normalement, une interface CRUD a des méthodes public 'Créer', 'Lecture', 'Mise à jour' et 'Supprimer' qui partagent les mêmes méthodes private. Ceci est fait pour la DRY meilleure pratique. Cependant, ce faisant, ces méthodes fonctionneront parfaitement la plupart du temps, mais pas tout le temps.

Alors, comment tester et résoudre le blocage du thread? 

Assurer:

  • Les actions session.save(myObj) vérifient d’abord le caractère unique de la PK 
  • Toutes les requêtes uniqueResult() renvoient effectivement 1 résultat, And;

    (Important!) Cas de test Focus qui:

    • Introduire des doublons de PK
    • Mettre à jour/Lire/Supprimer des enregistrements/entrées/lignes inexistants

Enfin, utilisez @AfterSuite ( TestNG ) pour supprimer toutes les entrées de la table. Toute mise en œuvre insuffisante donnera un autre blocage de thread sur l'opération susmentionnée ... sinon, vous êtes en or. 

1
Koffy

Vérifiez si votre clause where est optimisée .. c'est-à-dire en utilisant une clé primaire et/ou des index

0
gladiator

Si tout ce qui précède ne fonctionne pas, vérifiez le message d'erreur dans le journal mysql. S'il mentionne la taille du fichier journal, vous devez l'augmenter dans la configuration et redémarrer le serveur mysql.

0
Brian Ko