It is not really a lock. The first finished put will win, the other concurrent puts will fail and retry.
On Oct 31, 8:37 pm, jeremy <[EMAIL PROTECTED]> wrote: > "All writes are transactional." > > Does this mean updating values on a single entity will lock the entire > group when put() is called? > > On Sep 22, 10:52 am, Jeff S <[EMAIL PROTECTED]> wrote: > > > To further clarify. All writes are transactional. Details on how the > > transactions work can be found in ryan's presentation from Google > > I/O:http://snarfed.org/space/datastore_talk.htmlThesection on > > transactions specifically begins at slide 49. You can also watch the > > video > > here:http://sites.google.com/site/io/under-the-covers-of-the-google-app-en... > > > Cheers, > > > Jeff > > > On Sep 22, 10:36 am, Jeff S <[EMAIL PROTECTED]> wrote: > > > > Hi David, > > > > Even if a put request to the datastore is not run in a transaction, > > > the operation is automatically retried. Contention is not unique to > > > transactions. The benefit of using transactions, is that if one write > > > in the transaction times out (due to too much contention or some other > > > issue) the other parts of the transaction will not be applied. For > > > more details > > > see:http://code.google.com/appengine/docs/datastore/transactions.html#Usi... > > > > Happy coding, > > > > Jeff > > > > On Sep 18, 6:25 pm, DXD <[EMAIL PROTECTED]> wrote: > > > > > I appreciate any clarifications on my situation as follows. I have an > > > > entity group whose the root entity is called "root". When a particular > > > > URL is requested, a new entity is added to this group as a direct > > > > child of root. The code looks similar to this: > > > > > def insert(): > > > > root = Root.get_by_key_name('key_name') > > > > child = Child(parent=root) > > > > child.put() > > > > > Note that the insert() function is not run in a transaction (not > > > > called by db.run_in_transaction()). > > > > > I spawned many concurrent requests to this URL. The log shows that > > > > there are many failed requests with either "TransactionFailedError: > > > > too much contention on these datastore entities. please try again" or > > > > "DeadlineExceededError". Since I'm still a bit unclear about the > > > > internal working of the datastore, these are my explanations for what > > > > happened. Pls correct me where I'm wrong: > > > > > 1. when one child entity is being inserted, it locks the entire group. > > > > All other concurrent requests are blocked, and their child.put() > > > > statement exclusively is retried a number of times. Say the limit > > > > number of retry is r. > > > > > 2. If child.put() is retried r times but still doesn't go through, it > > > > gives up and yields the "too much contention" error. > > > > > 3. If child.put() does not yet reach r times of retry, but its session > > > > already reaches the time limit t, then it fails yielding the > > > > "DeadlineExceededError". > > > > > If my explanations are correct, isn't it true that the insert() > > > > function is exactly equivalent to this version?: > > > > > def insert(): > > > > root = Root.get_by_key_name('key_name') > > > > child = Child(parent=root) > > > > def txn() > > > > child.put() > > > > db.run_in_transaction(txn) > > > > > Or more generally, is it true that all API operations that write to > > > > the datastore have exactly the same effect with transaction > > > > (automatically retried if failed, and so on)? > > > > > Thanks for clarifications, > > > > David. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
