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=なし、y=なし)
  2. view2 はユーザー エンティティ データ全体を読み取ります (x=なし、y=なし)
  3. view1 user.x = 1(x=1, y=なし)
  4. view2 user.y = 2(x=なし、y=2)
  5. view1 user.put()(x=1, y=なし)
  6. view2 user.put()(x=なし、y=2)

これを修正する最善の方法と、最も適切と見なされる動作は何ですか? トランザクション (リクエストの 1 つが失敗しそうですが、大丈夫ですか)?

4

1 に答える 1

4

get と put をトランザクションにラップします。これにより、別の更新を踏みにじることができなくなります。

トランザクションの詳細については、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 に答える