Как сделать пакетные операции в NDB атомарными или заблокировать запись для обновления ndb

Я новичок в движке приложений Google и NDB. Моя проблема: если у меня есть 1 объект в модели, я хочу предотвратить конфликт при 2 параллельных операциях, примеры кода:

class MyModel(ndb.Model)
  count = ndb.IntegerProperty()
  def update_value(delta)
    count=count +delta

операция 1:

my_obj1= MyModel.get_by_id(1)
my_obj1.update_value(10)
my_obj1.put()

операция 2:

my_obj2= MyModel.get_by_id(1)
my_obj2.update_value(20)
my_obj2.put()

Если 2 сеанса вызывают 2 операции параллельно, а перед операциями count=0 для объекта (id=1). Я хочу предотвратить конфликт по count value , например:

 operation1: read my_obj1 from entity(id=1) 
 operation2: read my_obj2 from entity(id=1)
 operation1: update_value(10) #count =10
 operation2: update_value(20) # count=20
 operation1: put() # save to ndb with count =10 
 operation2: put() # save to ndb with count=20

count=20 в ndb. Желаемое значение count=30 в ndb.

Пожалуйста, покажите мне решения.


person Nguyen Thanh Ho    schedule 04.07.2012    source источник


Ответы (2)


Для этого можно использовать транзакции. Но масштабироваться не будет.

person Guido van Rossum    schedule 04.07.2012
comment
Благодарю вас! Я попробую использовать транзакцию. - person Nguyen Thanh Ho; 12.07.2012

Попробуйте с объектом lock и надейтесь, что это blog может помочь.

person nguyên    schedule 05.07.2012
comment
Я могу использовать блокировку для класса MyModel, таким образом, каждая сущность этого класса должна ждать получения блокировки. Скорость приложения будет медленнее. Если у нас нет законченного решения, мы можем использовать решение для исправления данных для этого сценария. - person Nguyen Thanh Ho; 05.07.2012