ページへ戻る

− Links

 印刷 

Google App Engine for Python その2 のバックアップ差分(No.7) :: NJF Wiki

xpwiki:Google App Engine for Python その2 のバックアップ差分(No.7)

« Prev[4]  Next »[5]
6: 2015-07-15 (水) 18:46:46 njf[6] ソース[7] バックアップ No.6 を復元して編集[8] 7: 2015-07-20 (月) 17:01:01 njf[6] ソース[9] バックアップ No.7 を復元して編集[10]
Line 175: Line 175:
実際には登録日や更新日時、ゲームのバージョンなど、管理用のデータを加えることになると思いますが、最低限必要なのはこれだけです。 実際には登録日や更新日時、ゲームのバージョンなど、管理用のデータを加えることになると思いますが、最低限必要なのはこれだけです。
 +
 +*IDの加算と排他処理 [#g6b90e90]
 +
 +ユーザーIDを取得して加算する処理は以下のようになります。
 +
 + @ndb.transactional
 + def getUserId():
 +     userIdIndex = "userIdIndex"
 +     lastId = UserIdCounter.get_by_id(userIdIndex)
 +     if lastId is None:
 +         lastId = UserIdCounter(id=userIdIndex)
 +         lastId.userId = 0
 +
 +     nowId = lastId.userId
 +
 +     lastId.userId = lastId.userId + 1
 +     lastId.put()
 +
 +     return nowId
 +
 +@ndb.transactionalを指定すると以下に続く処理が排他的に行われます。もし2つの処理が同時に走ったとき、UserIdCounterへの値の加算と取得がたとえば、
 +
 ++UserIdCounterの取得
 ++UserIdCounterの加算
 ++UserIdCounterの取得
 ++UserIdCounterの加算
 +
 +となればもちろん問題ないのですが、
 +
 ++UserIdCounterの取得
 ++UserIdCounterの取得
 ++UserIdCounterの加算
 ++UserIdCounterの加算
 +
 +となると同じ値をとって最後に2加算することになり、同じ値が返されることになります。@ndb.transactionalを指定することでこれを防ぐことが出来ます。
 +
 +データモデルは初期化の時にidというパラメータを指定することで、次からget_by_idというメソッドでデータを取得することが可能になり、一意のidがある場合はこれでデータの取り出しを行うと便利です。今回はデータは1つしか無いので固定でidを与えています。
 +
 +
 +
準備中 準備中
« Prev[4]  Next »[5]