2010-04-09 148 views
11

CouchDB在進行雙向複製時如何處理衝突?Couchdb衝突解決方案

例如: 假設有兩個地址簿數據庫(在服務器A和B中)。有一個Jack的文件,其中包含Jack的聯繫方式。

  1. 服務器A和B被複制並都有傑克文檔的版本相同。
  2. 在服務器A中,Jack的手機號碼已更新。
  3. 在服務器B中,更新了Jack的地址。
  4. 現在,當我們進行雙向複製時存在衝突。

couchDB如何處理它?如果我們在Java程序中啓動複製,有沒有辦法知道java程序是否有任何衝突?

回答

17

CouchDB的wiki有一個詳細的explanantion:http://wiki.apache.org/couchdb/Replication_and_conflicts

簡言之:CouchDB的不嘗試合併版本衝突。兩個版本都被複制到兩個副本中。確定性(但從應用程序立場可能是任意的)算法選擇其中之一作爲「官方」版本。它將在兩個副本上選擇相同的版本。只有此版本在默認情況下和視圖中可見。您的應用程序可以查詢其他版本,並根據其需要合併它們(可能涉及用戶通過在屏幕上顯示所有版本)。如果您的應用程序不查找衝突,則兩個更新中的一個將被有效丟失。

如果您沒有使用複製或批量加載API(但是每個文檔的REST API),衝突的更新將不會將其添加到數據庫中,但會被拒絕併產生409錯誤。你必須在嘗試再次更新之前進行合併(就像在Subversion中一樣)。