Состояние запуска в хранилище данных GAE

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()

В приведенном выше коде (increment_counter) я считываю счетчик из ModelCount и увеличиваю его на единицу. Я сталкиваюсь с условием выполнения в методе increment_counter когда сервер получает несколько запросов. Поэтому я хочу сделать increment_counter атомарным. Если я использую @db.transactional на increment_counter, я получаю ошибку "Только ошибки предков разрешены внутри транзакций".

Как я могу исправить это и сделать его атомарным?

1 ответ

вы можете попытаться использовать sharding https://developers.google.com/appengine/articles/sharding_counters

полный источник доступен по адресу https://github.com/GoogleCloudPlatform/appengine-sharded-counters-python

licensed under cc by-sa 3.0 with attribution.