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
Vous devez éviter * * atomicité; le GAE vous donne * une consistance finale *, pas un stockage de données atomique. –
Mais dans mon cas, je veux préserver la cohérence. Comment puis-je y arriver? Dois-je utiliser des verrous? –
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. –