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 .. ??
Voici quelques suggestions:
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.
Cela pourrait aussi être causé par une mauvaise utilisation de l'annotation suivante, comme dans l'article this StackOverflow:
@Transactional(propagation = Propagation.REQUIRES_NEW)
(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:
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:
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.
Vérifiez si votre clause where est optimisée .. c'est-à-dire en utilisant une clé primaire et/ou des index
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.