0

У меня есть много взглядов, манипулирующих сущности одного и того же рода: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() 
    ... 

Очевидно, что это к ошибкам из-за возможных условиях гонки (последние победы):

  1. view1 считывает целые данные пользователя сущностей (х = нет, у нет = None)
  2. view2 читает целые данные пользователя сущностей (х = нет, у нет = None)
  3. view1 user.x = 1 (х = 1, Y = None)
  4. view2 user.y = 2 (х = нет, у = 2)
  5. view1 user.put() (х = 1, у = None)
  6. view2 user.put() (х = нет, у = 2)

Что лучшие способы исправить это и какое поведение считается самым достойным? Транзакции (один из запросов будет терпеть неудачу, это нормально)?

+1

Да, с помощью операции является типичным способом для решения таких вопросов. –

ответ

1

Оберните свою сделку и получите ее. Это гарантирует, что вы не можете топать по другому обновлению.

Дополнительная информация о документации transactions with the NDB Client Library.

В вашем коде, вы можете, например, использовать только транзакции декоратора ОПРСА:

@ndb.transactional(retries=1) 
def view1(request, key): 
    user = ndb.Key(urlsafe=key).get() 
    user.x = 1 
    user.put() 
    ... 

@ndb.transactional(retries=1)  
def view2(request, key): 
    user = ndb.Key(urlsafe=key).get() 
    user.y = 2 
    user.put() 
Смежные вопросы