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數據存儲
我該如何解決這個問題並使之成爲原子?
你應該避免* *原子; GAE給你*最終一致性*,而不是原子數據存儲。 – 2014-09-02 12:13:19
但在我的情況下,我想保持一致性。我怎樣才能實現它?我需要使用鎖嗎? – 2014-09-02 12:18:14
你不能,不可靠。在任何情況下,你都會殺死任何和所有的性能,因爲你必須等待你的數據被複制到世界各地廣闊的Google數據中心網絡中。 – 2014-09-02 12:18:43