J'ai des problèmes avec la sélection de MySQL .. Pour la mise à jour de MySQL, voici la requête que j'essaie d'exécuter: Après cela, le thread concerné fera une mise à jour et changera le nom d'hôte. , qui est alors il devrait déverrouiller la ligne. p> Je suis exécutant une application Java multi-threadé, donc 3 threads exécutent cette instruction SQL, mais lorsque le thread 1 est exécuté, il ne verrouille pas ses résultats. Du fil 2 & 3. Par conséquent, les threads 2 et 3 obtiennent les mêmes résultats et ils pourraient mettre à jour la même ligne. P> Aussi chaque thread est sur sa propre connexion MySQL. P> I ' m Utilisation d'innoDB, avec une transaction-isolation = lecture-engagée et l'autocommande est désactivé avant d'exécuter la sélection de la mise à jour p> Puis-je manquer quelque chose? Ou peut-être qu'il y a une meilleure solution?
Merci beaucoup. P> code: p> thread: p> Sélectionnez: p > aide s'il vous plaît ....: p> résultat: p>
3 Réponses :
La connexion que vous créez que SELECT pour la mise à jour doit être identique à laquelle il est utilisé pour effectuer la mise à jour. Sinon, cela ne fait pas partie de la même transaction et libère la serrure, de sorte que vos autres threads commencent à l'exécuter aussi. Donc, dans votre code, vous devez le faire:
if (rs.first()) { String s = rs.getString("HostName"); oid = rs.getLong("OID"); System.out.println("oid_oldest/host/threadName=="+oid+"/"+s+"/"+threadName); } Util.doUpdateTest(oid,name,conn); conn.commit();
Salut Hiro2k, merci pour votre réponse. Je ne peux pas changer la configuration du serveur de base de données, je veux dire que je ne peux pas changer le fichier My.ini. Mais dans le manuel de MySQL, ils disent que si la lecture en commémoration est définie, seul l'index sera verrouillé, ce qui est correct dans mon cas car la colonne Nom d'hôte est un index ....
Pourriez-vous s'il vous plaît envoyez-moi votre exemple de code puis je le comparez à la mienne?
Bonjour Rachid, je ne peux pas partager le code mais je viens de vous rappeler que vous pouvez modifier le niveau d'isolement sur la connexion en utilisant SetTransAdisolation. Essayez d'essayer si cela fonctionne pour vous.
J'ai changé de my.ini juste pour tester, mais cela signifie toujours le même comportement, je veux dire que les deux threads peuvent exécuter la sélection de la mise à jour de la même ligne, elles exécutent également la mise à jour. Donc, deux mises à jour sont exécutées sur la même ligne! Comme je peux voir dans la console: pst_threadname = thread2_: mise à jour B2BICHOCKOPPOINT SET Nom d'hôte = '1_HOST_THread-2', UpdateTimeMestamp = 1294940161838 OID = 1 PST_THEDADNAME = thread1_: mise à jour B2BICHECKECKOPPOINT SET NOME = 1294940161853 Où OID = 1
Salut désolé, j'ai mis l'autocommande à False, j'ai essayé avec les deux. Mais toujours le même comportement que je ne sais vraiment pas pourquoi!
Une question ici, dans la méthode DoselectockTest () que je dois faire: Conn.settaUtocommit (FALSE) ........ Conn.commit;? Je ne fais pas la commission à la fin de sélectionner ....
Le commit libère la serrure de votre ligne. Cependant, je viens de voir la partie de votre code qui fait la mise à jour, et c'est sa propre méthode, il y a donc votre problème! Vous devez transmettre votre connexion déjà créée à cette méthode au lieu de créer un nouveau. Sinon, c'est comme si vous avez commencé une nouvelle transaction.
Oki j'ai fait ça et il semble que j'ai un résultat différent, veuillez voir ma réponse. Merci beaucoup
Vous êtes super confus, mais au moins des choses ont l'air mieux après vos modifications. Il existe de multiples façons de faire cela, mais le meilleur moyen que j'ai trouvé est d'utiliser des méthodes Tout d'abord, vous devez préparer votre ResigneT.UPDate de JDBC * > CODE>:
Sélectionner .. . Pour mettre à jour l'instruction CODE> avec l'argument
RESEXET.CONCUR_UPDATABLE CODE>, comme celui-ci: P>
if(rs.next())
{
rs.updateString(columnIndex, "new_hostname");
rs.updateRow();
}
L'instruction SELECT ne peut pas aboutir à un jeu de résultats de travail causé par un groupe ou une commande par opération qui provoque une sorte. Le SELECT doit conserver une position active sur la table vers laquelle tout tri ne fournira pas. p>
Comment réalisez-vous ce code sage?