2011-11-11 3 views
0

Je me suis gratté la tête un peu sur une solution élégante pour s'attaquer à ce problème (qui ne semble pas avoir été abordé beaucoup). J'adore la fluidité du Active Record pattern, mais il semble être très sensible aux conditions de course car vous pourriez avoir une centaine de copies d'état indépendantes "faisant autorité" en même temps (avec une application web assez chargée).ActiveRecord motif et conditions de course

Par exemple, si j'ai une page qui donne des points joueurs avec le code comme ceci:

$user = User::fromUsername($username); 
$user->points++; 
$user->save(); 

... et une autre page qui retirer des points, comme celui-ci:

$user = User::fromUsername($username); 
$user->points -= 100; 
$user->save(); 

Qu'est-ce que se passe-t-il si ces deux pages sont appelées presque en même temps? J'imagine que si elles s'exécutent dans le bon ordre (complètement séquentiellement) tout ira bien, cependant, que se passe-t-il si la deuxième page lit l'état de la base de données avant que le premier ait couru mais enregistre après?

Est-il même possible de résoudre ce problème dans ActiveRecord? Quelles sont les meilleures pratiques pour atténuer cela (verrous partout?)

Merci.

Répondre

0

Je dirais que les opérations devraient être atomiques

http://en.wikipedia.org/wiki/Atomic_operation

+0

Oui, c'est ce que je demande au sujet - quelle est la meilleure façon est de faire des actions sûres sur les objets ActiveRecord sont atomiques ... –

+0

bien, Je ne suis pas sûr qu'un downvote est la bonne façon de me remercier d'avoir fourni le vocabulaire pour votre problème. Quoi qu'il en soit, vous dites que le problème n'a pas été résolu, mais des frameworks comme redis gèrent une file d'attente de transaction pour les rendre atomiques. http://jimneath.org/2011/03/24/using-redis-with-ruby-on-rails.html – Simon

+0

Je m'excuse pour le downvote - pas sûr de ce que je pensais là. Malheureusement, je ne peux pas le rétablir maintenant. Je pense que je devrais clarifier le libellé de la question et je vous remercie de l'avoir signalé. Je vais essayer de le faire demain. –

Questions connexes