2012-03-13 2 views
0

Supposons que j'ai ce contrôleur très simple:ActiveRecord de Rails expose les conditions de course?

class CountersController 
    def inc 
    c = Counter.find(1) 
    c.value += 1 
    c.save! 
    end 
end 

Si deux clients accèdent méthode inc en même temps, est-il possible que c.value seulement augmente de 1? Si oui, comment résoudre ce problème?

Répondre

0

son mieux à faire l'incrément dans la base de données comme ceci:

Counter.update_counters id, :value => amount to increment 

donc pour vous son comme celui-ci

Counter.update_counters 1, :value => 1 

qui crée à suivre l'instruction SQL

UPDATE "counters" SET "value" = COALESCE("value", 0) + 1 WHERE "counters"."id" = 1 
+0

le 'inc' est juste un échantillon. –

+0

vous ne pouvez résoudre cela en ayant la base de données gérer cela, car son verrouillage de la ligne au cours de la mise à jour et mon code montre comment mettre cela dans la base de données – beanie

1

Si vous le faites comme ceci:

def inc 
    c = Counter.find(1) 
    c.with_lock do 
     c.value += 1 
     c.save! 
    end 
    end 
end 

Il verrouille la ligne dans la base de données lors de la mise à jour.

Questions connexes