私のサンプル(http://blog.virtual-tech.net/2009/07/google-app-engine-restfulcrudservlet.html)はAJAXなんで、あまり参考にならんかもしれませんが、一応、やっていることを説明させていただきますね。
まず、受け取ったリクエストパラメータには、アプリのPKが入っていることが前提なんですが、Insertの前にそのPKで検索を試みて、登録されていなければinsertするというようなことをしています。これで必ず1つだけ登録されることが保証されます。ただ、検索はすごく速いので問題ないのですがInsertは遅いのでちょっと問題です。Memcacheなどでなんとかやりたい気もしますが、私はまだできていません。
アプリのPK作成では、ユーザIDやタイムスタンプなどと組み合わせれば、どのタイミングで作成しても問題ないと思いますが、クライアント側で送信する都度PKが変わってしまうと登録成功になってしまうので、送信ボタンを押すタイミングで生成するのではなく、画面に表示されたタイミングなどで生成するのがよいのではないかと思います。
// 1. クライアントから受け取ったXML(JSON)をオブジェクトに変換
JdoUtils jdoUtils = new JdoUtils();
Invoice invoice = (Invoice) getEntity(req, MODEL_PACKAGE);
try {
jdoUtils.getInvoiceByKey(invoice);
// 2. すでに登録されている場合エラー
Status status = new Status();
status.code = HttpStatus.SC_CONFLICT;
status.message = "PK already exists.";
doResponse(resp, status, toXml, MODEL_PACKAGE);
} catch (JDOObjectNotFoundException e) {
// 3. 登録されていなければinsert
jdoUtils.insert(invoice);
doResponse(resp, invoice, toXml, MODEL_PACKAGE, HttpStatus.SC_CREATED);
2009/07/31 2:20 に k2junior<k2.ju...@gmail.com> さんは書きました:
--
_/ 有限会社バーチャルテクノロジー 竹嵜 伸一郎
_/ Virtual Technology, Ready to Cloud
_/ http://www.virtual-tech.net/
> 確かに連番である必要はないですね。なるほど。
> 適当にIDを生成する戦略であれば、例えば、ログインが前提になりますが、
>「ログインID+時刻」をリクエストIDにすれば、ほぼ一意性を保てますね。
連番の必要がなく、ユニークなIDの生成であれば、
uuid を利用するのはいかがでしょうか?
http://www.python.jp/doc/release/lib/module-uuid.html
uuid.uuid4() でランダムなIDを生成可能です。