2016-08-15 138 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()