2016-08-15 73 views
0

我有很多的意见操纵相同类型的实体:云存储:如何避免竞争条件

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. 厂景读取整个用户实体数据(x =无,Y =无)
  2. 视图2读取整个用户实体数据(x =无,Y =无)
  3. 厂景user.x = 1(X = 1,Y =无)
  4. 视图2 user.y = 2(X =无,Y = 2)
  5. 厂景user.put()(X = 1,Y =无)
  6. 视图2 user.put()(X =无,Y = 2)

哪些解决这个问题的最好方法以及哪种行为被认为是最体面的?交易(其中一个要求会失败,这是好的)?

+1

是,使用事务是解决这类问题的典型方法。 –

回答

1

裹住你的交易。这将确保您不能踩踏不同的更新。

你可以阅读更多关于transactions with the NDB Client Library的文件。

在你的代码,例如,你可以只使用NDB交易装饰:

@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()