Looking at the create_or_update function here: http://code.google.com/appengine/docs/python/datastore/transactions.html
It would seem that transactions will do what you want. In the else: clause where they do the update, you would probably want to change this to throw an exception. If this didn't work, then it'd be possible to create 2 duplicate records, which would seem to defeat the purpose. -john On Thu, Sep 3, 2009 at 7:47 AM, Dave<dabo...@gmail.com> wrote: > > My app generates a unique id string for each user who registers (like > a tinyurl). The id is based on random numbers, which are seeded from a > hash of their user information. There are over 240 million > combinations possible for the id, but I want to avoid collision by > checking against the datastore first to make sure a user with this id > doesn't already exist. > > While it's unlikely to happen, I see a potential race condition if 2 > users register at almost the same time, and their user information > hashes the same id. It's possible that both could check the datastore > for id uniqueness before either has inserted the new record, and as > such I could end up with two users in the datastore with the same id. > Unlikely, but possible. > > Could I resolve this with a transaction, by making the lookup and > subsequent insert a single transaction? Or would this not really > resolve the issue, as a transaction's view of the datastore is frozen > at the start of the transaction (so I wouldn't see the other record > just inserted). If a transaction isn't the way to go, can you > recommend a method to get out of this race condition? > > Thanks, > Dave > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~----------~----~----~----~------~----~------~--~---