6: 2015-07-15 (水) 18:46:46 njf[6] [7] [8] | 7: 2015-07-20 (月) 17:01:01 njf[6] [9] [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を与えています。 | ||
+ | |||
+ | |||
+ | |||
準備中 | 準備中 |
(This host) = https://njf.jp