2014-09-02 5 views
0
class ModelCount(db.Model): 
    type = db.StringProperty(required=True,default='Default-type') 
    count = db.IntegerProperty(required=True, default=0) #Current counter 

    def to_dict(self): 
     d = dict([(p, unicode(getattr(self, p))) for p in self.properties()]) 
     d["id"] = self.key().id() 
     return d 

    #Increments counter 
    @staticmethod 
    def increment_counter(en_name): 
     modelCount = ModelCount.all().filter('type',en_name).get() 
     if modelCount: 
      modelCount.count += 1 
      modelCount.put() 
     else: 
      modelCount = ModelCount(type=en_name, count=1) 
      modelCount.put() 

Dans le code ci-dessus (increment_counter), je lis le compte de ModelCount et par un incrémenter. Je fais face à la condition d'exécution dans la méthode increment_counter lorsque le serveur reçoit plusieurs demandes. Donc, je veux faire increment_counter atomique. Si j'utilise @db.transactional sur increment_counter, j'obtiens l'erreur "Seules les requêtes ancêtres sont autorisées à l'intérieur des transactions". Comment puis-je résoudre ce problème et le rendre atomique?état d'exécution dans GAE datastore

+0

Vous devez éviter * * atomicité; le GAE vous donne * une consistance finale *, pas un stockage de données atomique. –

+0

Mais dans mon cas, je veux préserver la cohérence. Comment puis-je y arriver? Dois-je utiliser des verrous? –

+0

Vous ne pouvez pas, pas de manière fiable. Et dans tous les cas, vous supprimerez toutes les performances, car vous devrez attendre la réplication de vos données sur l'ensemble du vaste réseau de centres de données Google à travers le monde. –

Répondre