Python GAE数据存储中的运行条件

Python GAE数据存储中的运行条件,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,在上面的代码(increment\u counter)中,我从ModelCount读取计数并将其递增一。当服务器接收到多个请求时,我将在increment\u counter方法中面临运行条件。因此,我想使递增计数器原子化。如果我在增量计数器上使用@db.transactional,我会得到“事务内部只允许祖先查询”错误 如何修复此问题并使其原子化?您可以尝试使用切分 完整源代码位于您应该避免原子性;GAE提供了最终的一致性,而不是原子数据存储。但在我的情况下,我希望保持一致性。我怎样才能做到呢

在上面的代码(
increment\u counter
)中,我从
ModelCount
读取计数并将其递增一。当服务器接收到多个请求时,我将在
increment\u counter
方法中面临运行条件。因此,我想使
递增计数器
原子化。如果我在
增量计数器
上使用
@db.transactional
,我会得到“事务内部只允许祖先查询”错误


如何修复此问题并使其原子化?

您可以尝试使用切分


完整源代码位于

您应该避免原子性;GAE提供了最终的一致性,而不是原子数据存储。但在我的情况下,我希望保持一致性。我怎样才能做到呢?我需要使用锁吗?那么不要使用基于计数的ID。改用UUID或其他随机值。或者只使用自动数据存储密钥id。不会发生冲突。或者更确切地说,可能每隔几百万年发生一次碰撞。。。。。你的申请必须持续那么长时间吗?
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()