2014-09-02 214 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() 

運行條件在上面的代碼(increment_counter),我從ModelCount讀取計數和由一個遞增它。當服務器收到多個請求時,我面對運行條件increment_counter方法。所以我想使increment_counter原子。如果我在increment_counter上使用@db.transactional,我會得到「只允許在事務內部進行祖先查詢」錯誤。在GAE數據存儲

我該如何解決這個問題並使之成爲原子?

+0

你應該避免* *原子; GAE給你*最終一致性*,而不是原子數據存儲。 – 2014-09-02 12:13:19

+0

但在我的情況下,我想保持一致性。我怎樣才能實現它?我需要使用鎖嗎? – 2014-09-02 12:18:14

+0

你不能,不可靠。在任何情況下,你都會殺死任何和所有的性能,因爲你必須等待你的數據被複制到世界各地廣闊的Google數據中心網絡中。 – 2014-09-02 12:18:43

回答