2015-04-07 55 views
1

作爲CouchDB或NoSQL的新手,通常我無法找到更新兩個文檔的好方法,但要保證兩個文檔都更新,或者兩者都不更新。使用CouchDB交易式更新兩個文檔

在我的用例中,每個文檔都有一個布爾標誌。爲了說明,讓我們假設我正在談論布爾型屬性isKing的type =「citizen」的文檔。我想確保一次只有一個國王。當我想改變國王時,它變得棘手。這需要修改兩個文件(爲新國王設置isKing = true,並且對舊國王設置isKing = false)。

我該如何確保在一些不幸的併發更新之後,我不會以兩位或零位國王結束?

我正在考慮bulk update,但它不起作用,因爲它不支持事務。

編輯:我見過問題Can I do transactions and locks in CouchDB?,但它沒有解決我的情況。它也涉及到CouchDB中的事務,但這就是相似之處的結束。問題在於事務性地讀取&更新一個文檔,而我正在詢問有關兩個文檔的事務性更新。我沒有找到對我的案例有用的其他問題的答案,但如果您認爲它是重複的,請解釋原因。

+0

可能的重複:http://stackoverflow.com/questions/299723/can-i-do-transactions-and-locks-in-couchdb –

+0

@ChrisSnow - 感謝您的評論。我已經在打開這個之前閱讀過你提到的問題。我只是沒有找到適用於我的案例的解決方案。主要區別在於我想一次更新兩個文檔。 – TMG

+1

國家可以擁有其他文件,指向目前的國王,也許是一個國王的歷史等,或者它可以被看作是一個事件,如KingElected和KingAbticated等文件... – Daniel

回答

1

事務性語義與批量更新

總之,有無(由設計)。但是,您可以要求CouchDB檢查_bulk_docs請求中的所有文檔都通過了所有的驗證功能。如果即使一個失敗,也不會寫入任何文件。您可以通過在請求中包含「all_or_nothing」:true來選擇此模式。

通過比較oldDoc._revnewDoc._rev處理修訂驗證在自己的validate_doc_update功能。

如果你讓一個文檔的驗證失敗 - 另一個也不會被寫入。

+0

這很有趣。我讀了all_or_nothing,但引用之後的句子是:「在這種模式下,如果所有文檔都通過驗證,則所有文檔都會更新,即使這會導致部分或全部文檔發生衝突。」這阻礙了我探索它。我沒有想到我可以使用您提出的驗證來處理衝突管理。 – TMG

+0

與內置衝突管理相比,這種驗證是否存在任何限制或副作用?國際海事組織編號: – TMG

+0

當內置jn修訂處理模式未禁用時,您的定製修訂處理將永遠不會執行。即使它會 - 它只是應該沿着內置的等價物來實施。 –