get_or_insert() guarantees uniqueness of the full Key of the object.
And the parent key is part of this Key.
Because it is handled by a transaction, if two transactions want to
access an object with the same Key one is blocked.

2009/11/10 Satoshi <[email protected]>:
>
> I am implementing a mechanism to guarantee the uniqueness of property
> value (account name of User entity). I am using Model.get_or_insert
> mechanism in this process, but the following description in the
> document makes me wonder if it is really thread-safe.
>
> |   In other words, get_or_insert() is equivalent to this Python code:
> |
> |   def txn():
> |     entity = MyModel.get_by_key_name(key_name, parent=kwds.get
> ('parent'))
> |     if entity is None:
> |       entity = MyModel(key_name=key_name, **kwds)
> |       entity.put()
> |     return entity
> |
> |   return db.run_in_transaction(txn)
>
> I understand that this is thread-safe when I specify a parent, because
> both new entity and existing entity share the same parent, which means
> both belong to the same entity group.
>
> What I don't understand is the case where I don't specify a parent. In
> that case, new entity and existing entity are root entities - which
> means there are not in the same entity group. In such a case, it seems
> that there is a small chance that two threads see None as the result
> of get_by_key_name, and got into a race condition.
>
> It really depends how Google implements Model.get_or_insert(), and I'd
> really appreciate if somebody in Google could give me the answer.
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to