Ad
6: 2015-07-15 (水) 18:46:46 njf ソース バックアップ No.6 を復元して編集 7: 2015-07-20 (月) 17:01:01 njf ソース バックアップ No.7 を復元して編集
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を与えています。
 +
 +
 +
準備中 準備中


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 3988, today: 1, yesterday: 1
MenuBar
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失

Portuguese | English | German | Greek | Japanese | Korean | Russian | T-Chinese top
NJF