2011-12-09 2 views
1

Par exemple, j'ai un "Connection1" veut augmenter le compteur "currentcount", puis sélectionnez la valeur. "Connection2" veut faire la même chose et fonctionne exactement au même moment. Ce sont les requêtes qui sont en cours d'exécution (mais pas en tant que transaction).Comment éviter une condition de concurrence lors de l'utilisation d'un compteur lu et incrémenté par deux connexions?

Query 1: UPDATE table SET currentcount=currentcount+1; 
Query 2: SELECT currentcount FROM table; 

Si Connection1 et Connection2 fonctionnent Query1 en même temps, puis Query2 exactement au même temps, le résultat de query2 sera la même pour les deux connexions (à savoir une condition de course).

J'ai entendu dire que les transactions peuvent fonctionner dans cette situation. Comment pourrais-je résoudre ce problème dans mysql?

+0

Ne pouvez-vous pas utiliser un incrément automatique et laisser le moteur DB gérer cela pour vous? – gbn

+0

voir http://stackoverflow.com/a/8231775/6782 – Alnitak

+0

@gbn: L'auto-incrémentation n'est-elle pas utilisée uniquement lors de l'insertion de lignes dans une table de base de données? Je veux juste mettre à jour et lire une seule entrée dans le tableau. – eric

Répondre

1

Vous devez:

LOCK `table` 
... 
UNLOCK `table` 

Soyez conscient que cela peut affecter considérablement les performances en même temps que par nécessité, vous devez empêcher la deuxième connexion de faire quoi que ce soit en même temps que la première connexion (et vice versa). Cependant, cela ne devrait poser problème que si vous effectuez cette opération des milliers de fois par seconde.

De même, voir my answer pour une question similaire où il existe une procédure stockée qui peut être modifiée de manière triviale pour faire de votre cycle d'incrémentation/sélection un aller-retour unique au serveur.

+2

Merci. Existe-t-il une solution qui n'affecte pas les performances simultanées. Je cours ces requêtes jusqu'à 10 fois par seconde. – eric

+0

@eric 10 fois par seconde ne devrait pas poser de problème - cela ne devrait poser problème que si vous le faites des milliers de fois par seconde. – Alnitak

+0

Si la requête est en fait une UPDATE avec une table WHERE plutôt qu'une seule table, l'évolutivité sera limitée – gbn

Questions connexes