I've solved this for other systems, and it might work here.

Add a Guid as a field to the record.
When you update the document, check to make sure the Guid hasn't changed since 
you read it.  If the Guid is the same, go ahead and save the document along 
with a new Guid.

This keeps you from locking the document if you just want to read it while 
still keeping you from overwriting someone else's changes.  In this other 
system, it was easy enough to add the guid check as part of the where clause:

Update doc
                Set Text = Text
Where key = ?
And Guid = ?

If the row failed to update, then it was removed, or the Guids didn't match.

Not sure if C* has some magic that can make this better, timestamp should do 
the same thing I think.

"There are a multitude of methods whereby a feline might be divested of its 
epidermal layer"..

From: Tupshin Harper [mailto:tups...@tupshin.com]
Sent: Friday, January 10, 2014 5:13 PM
To: user@cassandra.apache.org
Subject: Re: Read/Write consistency issue

It is bad because of the risk of concurrent modifications. If you don't have 
some kind of global lock on the document/row, then 2 readers might read version 
A, reader 1 writes version B based on A, and reader 2 writes version C based on 
A, overwriting the changes in B. This is *inherent* to the notion distributed 
systems and multiple writers, and can only be fixed by:
1) Having a global lock, either in the form of a DB lock (CAS for Cassandra 2.0 
and above), or some higher level business mechanism that is ensuring only one 
concurrent reader/writer for a given document
2) Idempotent writes by appending at write and aggregate on read. For 
time-series and possibly counter style information, this is often the ideal 
strategy, but usually not so good for documents.
For the counters scenario, idempotent writes, or the rewrite of counters (which 
use idempotent writes behind the scenes) are probably good solutions.
Concurrent editing of documents, on the other hand, is almost the ideal 
scenario for lightweight transactions.
-Tupshin

On Fri, Jan 10, 2014 at 5:51 PM, Robert Wille 
<rwi...@fold3.com<mailto:rwi...@fold3.com>> wrote:
Interested in knowing more on why read-before-write is an anti-pattern. In the 
next month or so, I intend to use Cassandra as a doc store. One very common 
operation will be to read the document, make a change, and write it back. These 
would be interactive users modifying their own documents, so rapid repeated 
writing is not an issue. Why would this be bad?

Robert

From: Steven A Robenalt <srobe...@stanford.edu<mailto:srobe...@stanford.edu>>
Reply-To: <user@cassandra.apache.org<mailto:user@cassandra.apache.org>>
Date: Friday, January 10, 2014 at 3:41 PM

To: <user@cassandra.apache.org<mailto:user@cassandra.apache.org>>
Subject: Re: Read/Write consistency issue

My understanding is that it's generally a Cassandra anti-pattern to do 
read-before-write in any case, not just because of this issue. I'd agree with 
Robert's suggestion earlier in this thread of writing each update independently 
and aggregating on read.

Steve


Reply via email to