"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.htmlThe section 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 google-appengine@googlegroups.com 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 -~----------~----~----~----~------~----~------~--~---