You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by Apache Wiki <wi...@apache.org> on 2009/09/21 05:07:28 UTC
[Couchdb Wiki] Update of "Transaction_model_use_cases" by AnthonyTowns
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Couchdb Wiki" for change notification.
The "Transaction_model_use_cases" page has been changed by AnthonyTowns:
http://wiki.apache.org/couchdb/Transaction_model_use_cases?action=diff&rev1=27&rev2=28
'''''The proper way to do this is treat CouchDB as a ledger, with each line item as a new document. Then to do a transfer a single document that shows the money subtracted from account A and added to account B. To get the balance of an account, create a view of transactions by account and use a reduction to add up all the transactions for each account.'''''
+ == Harder example involving money ==
+
+ Documents store a transaction log -- from account, recipient account and amount transfered. A view exists to give a balance for each account. At all times, every accounts' balance should be greater-or-equal to zero. Balance of account A is $100. Two transactions proposed, "Transfer $80 from A to B", and "Transfer $60 from
+ A to C":
+
+ 1. Check Balance of A >= $80 (query view)
+ 2. Check Balance of A >= $60 (query view)
+ 3. Transfer $80 from A to B (add new document)
+ 4. Transfer $60 from A to C (add new document)
+ 5. Check Balance of A --> -$40 (query view)
+
+ No explicit conflicts even appear in this case to alert you to the problem...
+
+ I guess writing the transfer function as:
+
+ 1. Tentatively transfer AMOUNT from ACCOUNT to DESTINATION (add new document, marked tentative)
+ 2. Wait for document to have been replicated to all other hosts
+ 3. Determine balance of ACCOUNT (query view)
+ 4. If balance >= 0: remove tentative mark from transaction
+ 5. Otherwise: delete transaction
+
+ might be feasible, but getting the right semantics for the second step seems hard.
== Users, groups and relationships ==