2010-11-30 6 views
1

J'ai des problèmes avec SELECT MySQL .. FOR UPDATE, voici la requête que je suis en train de courir:MYSQL SELECT ... POUR MISE À JOUR Ne fonctionne pas?

SQL = "SELECT * " + 
     "FROM " + TableName + " " + 
     "WHERE out_status IN ("+outSStatus+") AND queued <= NOW() " + 
     "ORDER BY out_status, id_queue ASC "+ limitSql+ 
     "FOR UPDATE"; 

Après cela, le fil va faire une UPDATE et changer le out_status à 99, qui est alors il devrait débloquer la rangée.

Je suis en cours d'exécution d'une application Java multi-thread, donc 3 fils sont en cours d'exécution de cette instruction SQL, mais quand fil 1 fonctionne cela, il ne se verrouille pas (cacher) ses résultats de fil 2 & 3. Par conséquent, les discussions 2 & 3 obtiennent les mêmes résultats.

Chaque thread est également sur sa propre connexion mysql.

Quelqu'un peut-il m'aider s'il vous plaît avec ceci? OU peut-être avoir une meilleure solution?

Très appréciée.

Répondre

1

Il pourrait travailler, et vous ne pouvez pas remarquer. Say thread 1 a exécuté l'instruction et a validé la transaction automatiquement, car auto-commit était activé. Alors bien sûr, le thread 2 serait capable de le faire aussi.

Essayez de définir auto-commit off, en utilisant this method de Connection classe, puis consultez le résultat.

+0

J'ai mis auto-commit = off ... Et avec ce qui précède, j'ai encore besoin d'utiliser des transactions pour que cela fonctionne? Par exemple: BEGIN et COMMIT – James

+0

@ James: Ok, mais au moins ça a commencé à fonctionner. Vous pouvez accepter la réponse de Vikash alors, je suggère. –

2

J'ai eu un problème similaire. Les deux réponses, de @Vikash et @Adeel Ansari, sont des suggestions valables. Cependant, j'ai résolu le problème en utilisant InnoDB moteur au lieu de MyISAM. MyISAM permet uniquement le verrouillage au niveau de la table, pas au niveau de la ligne. Vous avez toujours besoin de transactions lorsque vous utilisez InnoDB.

Questions connexes