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:
get_with_cas
)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.