1

我有很多操作同类实体的视图:

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

解决此问题的最佳方法是什么?什么行为被认为是最体面的?交易(其中一个请求会失败,可以吗)?

4

1 回答 1

4

包装您的获取并投入交易。这将确保您不会踩到不同的更新。

您可以使用 NDB 客户端库文档阅读有关事务的更多信息。

例如,在您的代码中,您可以只使用 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()
于 2016-08-16T15:25:03.180 回答