シャーディング カウンターの例 (code.google.com/appengine/articles/sharding_counters.html) を Java に移植しようとしています。唯一の問題は、Java API に Python の「get_by_key_name」のような呼び出しがないことです。これが基本的な考え方です:
Transaction tx = pm.currentTransaction();
Key key = KeyFactory.createKey(CounterShard.class.getSimpleName(), counter + randomIndex);
CounterShard shard = pm.getObjectById(CounterShard.class, key);
if (shard == null) { // API does not work this way...
shard = new CounterShard(key, counter);
}
shard.increment();
pm.makePersistent(shard);
tx.commit();
残念ながら、これを初めて実行すると JDOObjectNotFoundException がスローされます。特定の名前のカウンターが存在するかどうかを判断するクエリを実行できますが、それはトランザクションではありません。別のスレッドが同じことを行い、最終的に両方が同じキーを持つオブジェクトを作成する可能性があります。
私が理解していることから、(Java API の) トランザクション内でサポートされている唯一の操作は get と put です。では、まだ存在していない (つまり、'get' がない) キーでオブジェクトをロックし、それを作成した最初の唯一の人物であることを確認するにはどうすればよいでしょうか?