我試圖實現強一致性。讓我們把我的模型PVPPlayer
:AppEngine實現強一致性
class PVPPlayer(ndb.Model):
points = ndb.IntegerProperty()
爲模型中的每個關鍵是這樣創建的:
pvp_player = PVPPlayer(key=ndb.Key(Profile, "test_id", PVPPlayer, "test_id"))
其中Profile
是父模型:
class Profile(ndb.Model):
def build_key(cls, some_id):
return ndb.Key(cls, some_id)
我有2個REST API URL:
1) update_points
2) get_points
在1)我做的:
# I use transaction because I have to update all the models in single batch
@ndb.transactional(xg=True, retries=3)
def some_func(points):
pvp_player = ndb.Key(Profile, "test_id", PVPPlayer, "test_id").get()
pvp_player.points += points
pvp_player.put()
# update other models here`
在2)我做的:
pvp_player = ndb.Key(Profile, "test_id", PVPPlayer, "test_id").get()
return pvp_player.points`
我的流程是這樣的:
1) update_points()
2) get_points()
3) update_points()
4) get_points()`
...
問題:
使用get()
保證強一致性o我不明白的是爲什麼有時候由於get_points()
的結果,我得到的數據像陳舊的數據根本沒有更新。
例:
POST get_points -> 0
POST sleep 1-3 sec
POST update_points -> 15
POST sleep 1-3 sec
POST get_points -> 15
POST sleep 1-3 sec
POST update_points -> 20
POST sleep 1-3 sec
POST get_points -> 15 !!!`
是您的#2功能,還裝飾有'@ndb .transactional'?另外,我認爲#1中的'update_points'函數名稱確實是'update_points',對嗎? –
>你的#2功能是否也用@ ndb.transactional裝飾過? 我試圖爲#2添加@ ndb.transactional,但它並不重要 - 它仍然不時給我陳舊的數據 >#1中的update_points函數名稱確實是update_points,對不對? 絕對 –
對不起,我的意思是'some_func'是'update_points'? :) –