文書のバージョン管理および競合についての FAQ

分散データベースを使用する場合、データのコピーが複数の場所に保管される可能性があります。 それらのデータの同期を保つことが重要です。 しかし、作業環境によっては、ユーザーが自分の変更で文書を即時に更新できなかったり、データベースへの複製さえできなかったりすることがあります。

結果として、同じ文書のコピーがそれぞれ異なる更新を含むことになる可能性があります。 どのコピーが正しいのかを IBM® Cloudant® for IBM Cloud® は判断できないため、「競合」が発生します。

IBM Cloudant は、Multi-Version Concurrency Control (MVCC) を使用して、各データベース・クラスター内のすべてのノードに文書の最新バージョンのみが含まれるようにします。

結果整合性とは何ですか?

IBM Cloudant データベースでは、結果整合性を採用しています。これは、ノード間に違いがないことを IBM Cloudant が保証しなければならないことを意味します。 そういった不整合は、古い文書が同期化されるときに発生することがあります。

IBM Cloudant データベースが並行読み取りおよび書き込みアクセス権限を持つことが重要です。 MVCC はその能力を有効にします。 MVCC は、 IBM Cloudant データベースでの読み取り操作と書き込み操作を高速化する オプティミスティック並行性制御 の 1 つの形式です。これは、読み取り操作と書き込み操作にデータベース・ロックが必要ないためです。 それと同時に、MVCC は IBM Cloudant データベース・ノード間の同期も可能にします。

競合があることを確認するにはどうすればいいですか?

確認はできません。 時により、競合している文書をユーザーが要求することがあります。 そういったときに、IBM Cloudant は、競合が存在しないかのように文書を通常通りに返します。 しかし、返されるバージョンは必ずしも最新バージョンではありません。 そうではなく、複数の要素を考慮する内部アルゴリズムに基づいて選択されたバージョンです。 文書が返された時点で文書が常に最新であると想定してはなりません。

競合がある文書を識別するにはどうすればいいですか?

競合している文書を更新しようとすると、IBM Cloudant から 409 応答が返されます。 オフラインであるときに文書を更新しようとすると、IBM Cloudant は競合があるかどうかを検査できず、409 応答は返されません。

この状態が発生するときには、オンラインに戻ったときに文書競合がないかチェックするのが最善です。 文書競合を検出する必要がある場合、以下のマップ関数例を使用してください。

function (doc) {
  if (doc._conflicts) {
    emit(null, [doc._rev].concat(doc._conflicts));
  }
}

データベース内の複数の文書内の競合を検出したい場合は、ビューを作成してください。

競合を無視するとどうなりますか?

競合をチェックしないか、競合を修正しない場合、IBM Cloudant データベースでは以下の問題が生じます。

  • 競合する文書が増え続けるため、文書の不整合が多くなります。
  • 競合する文書を競合が解決されるまで保持する必要があるため、データベース・サイズが大きくなります。
  • 可能な範囲で最良のバージョンを見つけるためにすべての競合する文書を調べる必要があることが原因で、IBM Cloudant が各要求に応答するための作業が増えるため、パフォーマンスが低下します。

競合を解決するにはどうすればいいですか?

競合を見つけた後、それを解決するには以下の 4 ステップを実行します。

  1. 競合するリビジョンを取得する。
  2. それらをアプリケーション内にマージするか、所有者にどうしたいか尋ねる。
  3. 新しいリビジョンをアップロードする。
  4. 古いリビジョンを削除する。