couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ciprian Dorin Craciun <ciprian.crac...@gmail.com>
Subject Simple "transactional" access (i.e. "repeatable reads") (related to `last_seq` for previous revisions)
Date Tue, 18 Dec 2012 21:35:54 GMT
    Hello all!

    Previously I've written an email inquiring about how to get
`last_seq` on previous revisions of an object. The purpose of that is
described below.

    I intend to use CouchDB as a backend for a configuration
management solution. For this I need a way to achieve the following:
simple "repeatable reads" transactions...


    !!!! Now before everyone starts shouting at me that this is not
the purpose of CouchDB, or even achievable, I say to my defense that I
know that... I don't want transactions in the SQL sense, I just want
"repeatable reads"... :)


    All I want to achieve is the following:
    * given that the configuration of a service is composed of
multiple documents inside a database; (with multiple service
configurations sharing the same database;)
    * given that all updates that touch a configuration's documents,
are made in a single request of the bulk write (with atomic set to
true);
    * I want to be able to read "consistent" revisions of a particular
document graph, regardless of other write operations that have
happened;


    I think I could achieve this by using "multiple" get, but I'm
unsure, and moreover I don't know before hand which documents are
needed.


    To achieve this I though about the following simple algorithm
which provides me with a limited MVCC-like solution:
    * before reading or writing I read the last sequence number of the
entire database; (I call this the "session sequence";)
    * when reading a document I first "stat" it's latest revision and
see if it's sequence is less or equal to that of the session;
    ** if not I read a revision back and check again; (I stop after
reading a couple of revisions and give an error);
    * (up to this point all read documents are either coming from
unrelated "write sessions" or were written inside the same "write
session", but I can't have them mixed);
    * I repeat the above for any needed document;
    * any document to be written is batched inside a single bulk write
with atomic set to true;
    * if any conflict existed I go to step one;


    As seen I try to use time limited document versioning, to achieve
some kind of "repeatable reads" transactions.

    As such, are there other ideas, observations, solutions?

    Thanks,
    Ciprian.

Mime
View raw message