У меня есть много взглядов, манипулирующих сущности одного и того же рода:Cloud Datastore: способы избежать условий гонки
def view1(request, key):
user = ndb.Key(urlsafe=key).get()
user.x = 1
user.put()
...
def view2(request, key):
user = ndb.Key(urlsafe=key).get()
user.y = 2
user.put()
...
Очевидно, что это к ошибкам из-за возможных условиях гонки (последние победы):
- view1 считывает целые данные пользователя сущностей (х = нет, у нет = None)
- view2 читает целые данные пользователя сущностей (х = нет, у нет = None)
- view1
user.x = 1
(х = 1, Y = None) - view2
user.y = 2
(х = нет, у = 2) - view1
user.put()
(х = 1, у = None) - view2
user.put()
(х = нет, у = 2)
Что лучшие способы исправить это и какое поведение считается самым достойным? Транзакции (один из запросов будет терпеть неудачу, это нормально)?
Да, с помощью операции является типичным способом для решения таких вопросов. –