11

CouchDB は双方向レプリケーションを実行しているときに競合をどのように処理しますか?

例: 2 つのアドレス帳データベース (サーバー A と B) があるとします。ジャックの連絡先の詳細が記載されたジャック用のドキュメントがあります。

  1. サーバー A とサーバー B は複製されており、どちらも同じバージョンの Jack ドキュメントを持っています。
  2. サーバー A では、ジャックの携帯番号が更新されます。
  3. サーバー B では、Jack のアドレスが更新されます。
  4. 双方向のレプリケーションを行うと、競合が発生します。

couchDB はそれをどのように処理しますか? Java プログラムでレプリケーションを開始した場合、Java プログラムからの競合があったかどうかを知る方法はありますか?

4

1 に答える 1

18

CouchDBのドキュメントに説明があります。

簡単に言うと、CouchDB は競合するバージョンをマージしようとしません。両方のバージョンが両方のレプリカにコピーされます。決定論的 (ただし、アプリケーションの観点からはおそらく恣意的な) アルゴリズムは、それらの 1 つを「公式」バージョンとして選択します。両方のレプリカで同じバージョンが選択されます。このバージョンのみがデフォルトで表示され、ビューに表示されます。アプリケーションは他のバージョンを照会し、必要に応じてそれらをマージできます (すべてのバージョンを画面に表示することでユーザーを巻き込む可能性があります)。アプリケーションが競合を検出しない場合、2 つの更新のうちの 1 つが実質的に失われます。

レプリケーションまたは一括読み込み API (ただし、ドキュメントごとの REST API) を使用していない場合、競合する更新はデータベースに反映されず、409 エラーで拒否されます。再度更新を試みる前にマージする必要があります (Subversion と同様)。

于 2010-04-09T08:06:45.857 に答える