What is CAS in NoSQL and how to use it?
Write operations on Couchbase accept a parameter cas (create and set). Also the return result object of any non-data fetching query has cas property in it. I Googled a bit and couldn't find a good conceptual article about it.
Could anyone tell me when to use CAS and how to do it? What should be the common work-flow of using CAS?
My guess is we need to fetch CAS for the first write operation and then pass it along with next write. Also we need to update it using result's CAS. Correct me if I am wrong.
CAS actually stands for check-and-set, and is a method of optimistic locking. The CAS value is associated with each document which is updated whenever the document changes - a bit like a revision ID. The intent is that instead of pessimistically locking a document (and the associated lock overhead) you just read it's CAS value, and then only perform the write if the CAS matches.
The general use-case is:
- Read an existing document, and obtain it's current CAS (get_with_cas)
- Prepare a new value for that document, assuming no-one else has modified the document (and hence caused the CAS to change).
- Write the document using the check_and_set operation, providing the CAS value from (1).
Step 3 will only succeed (perform the write) if the document is unchanged between (1) and (3) - i.e. no other user has modified it in the meantime. Typically if (3) does fail you would retry the whole sequence (get_with_cas, modify, check_and_set).
There's a much more detailed description of check-and-set in the Couchbase Developer Guide under Concurrent Document Mutations.