如何在NDB中进行批处理操作是更新ndb的原子或锁定记录

时间:2012-07-04 01:09:57

标签: google-cloud-datastore app-engine-ndb

我是谷歌应用引擎和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)。我想防止计数值冲突,  例如:

 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
ndb中的

count = 20。 在ndb中,count = 30的欲望值。

请告诉我解决方案。

2 个答案:

答案 0 :(得分:2)

您可以为此使用交易。但它不会扩展。

答案 1 :(得分:1)

尝试使用lock对象,希望blog可以提供帮助。