2

私はグーグルアプリエンジンと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 つの操作を並行して呼び出し、操作の前にエンティティ (id=1) のカウント = 0 の場合。たとえば、次のように、 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=ndb で 20。ndb の count=30 の希望値。

解決策を教えてください。

4

2 に答える 2

2

これにはトランザクションを使用できます。しかし、それはスケーリングしません。

于 2012-07-04T15:41:04.473 に答える
1

ロックオブジェクトを試してみて、このブログが役立つことを願っています。

于 2012-07-05T01:23:48.240 に答える