Hi Chris,

> -----Original Message-----
> From: public-webapps-requ...@w3.org [mailto:public-webapps-
> requ...@w3.org] On Behalf Of Chris Anderson
> Sent: Friday, January 15, 2010 11:14 AM
> To: public-webapps WG
> Subject: IndexedDB and MVCC
> 
> Hi,
> 
> I've been reading the new IndexedDB spec as published here:
> http://www.w3.org/TR/IndexedDB/
> 
> My first impression is that this simpler than WebSimpleDB, but not too
> simple. I'm happy to see detached readers being mentioned.
> 
> There's one other piece of the concurrency story that could be useful.
> 
> In section 3.2.2 Object Store Storage steps
> 
> step 7: If the no-overwrite flag was passed to these steps and is set,
> and a record already exists with its key being key, then terminate
> these steps and set error code CONSTRAINT_ERR.
> 
> I think it wouldn't add much complexity to use a compare-and-swap
> pattern, instead of a no-write-if-exists pattern. This would allow for
> better concurrency via optimistic updates, and look a lot like HTTP
> etags.

Wouldn't these be different scenarios? The purpose of the flag is to help in 
scenarios where you don't want to automatically create an item, only update an 
existing one. What you're describing seems to be oriented towards the case 
where you're updating an existing item, have an optimistic concurrency token, 
and want to use it to check for conflicts before the update goes through. 

You definitely make a good point about the fact that the current document 
doesn't touch on how applications would handle optimistic concurrency. One way 
would be to build-in support for it (as you suggest, an optional path for the 
concurrency token, and perhaps also a timestamp sort of thing that gets 
automatically updated). Alternatively application code could do the 
check-and-update-or-fail deal within a transaction. 

> 
> It could be accomplished by allowing an object store to take a
> key-path for the update-token. Then subsequent updates could require
> that the key-path match. (Some additional complexity: we'd need the
> ability to check for a matching update-token, then change it, in a
> transaction).
> 
> CouchDB uses an MVCC token that must match to allow updates. This
> allows us to avoid locking. But even more important is the parallels
> we have with HTTP Etags (if-match for idempotence, if-none-match for
> caching).
> 
> The CouchDB style of MVCC can be accomplished by updates in a
> compare-and-swap transaction, so technically I can do what I want in
> the spec as it stands. But I still think the parallels to HTTP etags
> can be instructive.

Out of curiosity: if you were to layer CouchDB on top of IndexedDB, would  you 
always just use the dynamic locking mode, or do you actually have use for the 
other options offered?

I ask because I'm seriously concerned that the extra modes will add to the 
overall concept count in an attempt to simplify the use of transactions, and 
don't really simplify the end to end.

> 
> Chris
> 
> 
> --
> Chris Anderson
> http://jchrisa.net
> http://couch.io
> 

Thanks
-pablo


Reply via email to