Я пытаюсь добиться сильной консистенции. Назовём моя модель 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'? Кроме того, я предполагаю, что имя функции «update_points» в # 1 действительно «update_points», правильно? –
> Является ли ваша # 2 функция также украшенной @ ndb.transactional? Я попытался добавить @ ndb.transactional для # 2, но это не имеет значения - оно по-прежнему дает мне устаревшие данные время от времени > имя функции update_points в # 1 действительно update_points, не так ли? Абсолютно –
Извините, я имел в виду 'some_func'' 'update_points'? :) –