sql >> データベース >  >> NoSQL >> MongoDB

CouchDB / Couchbase / MongoDBトランザクションエミュレーション?

    Couchdbはデフォルトでトランザクションです。 couchdb内のすべてのドキュメントには、_revが含まれています 鍵。ドキュメントへのすべての更新は、この_revに対して実行されます キー:-

    1. ドキュメントを入手します。
    2. _revプロパティを使用して更新のために送信します。
    3. 更新が成功した場合は、ドキュメントの最新の_revを更新しています
    4. 更新が失敗した場合、ドキュメントは最新のものではありません。手順1〜3を繰り返します。

    MrKurtによるこの回答> 詳細な説明については。

    couchdbレシピ couchdbでトランザクションがどのように行われるかを示す銀行の例があります。

    また、このアトミック銀行振込もあります couchdbでのトランザクションを説明する記事。

    とにかく、これらすべてのリンクに共通するテーマは、_revに対して更新するcouchdbパターンに従う場合です。 データベースに一貫性のない状態を設定することはできません。

    _id以降、すべてのcouchdbドキュメントは一意です 2つのドキュメントのフィールドを同じにすることはできません。 クックブックを表示 を確認してください。

    コメントに基づいて編集

    この場合、別々のドキュメントを使用できます。ドキュメントを挿入し、成功の応答を待ちます。次に、

    のような別のドキュメントを追加します

    {_id:'some_id','count':1}

    これにより、これらのドキュメントの結果をカウントするだけのマップリデュースビューを設定でき、更新カウンターがあります。あなたがしているのは、更新のために単一のドキュメントを更新する代わりに、成功した挿入を反映するために新しいドキュメントを挿入することです。

    さて、私はすでに別々のドキュメントを更新する方法を説明しましたが、単一のドキュメントを更新する場合でも、次の場合は不整合を回避できます:

    1. 新しいファイルを挿入します
    2. couchdbが成功メッセージを表示したとき->カウンターの更新を試みます。

    これが機能する理由

    これが機能するのは、update documentを更新しようとすると、 _revを指定する必要があります ストリング。あなたは_revについて考えることができます ドキュメントのローカル状態として。このシナリオを検討してください:-

    1. 更新されるドキュメントを読みました。
    2. いくつかのフィールドを変更します。
    3. 一方、別のリクエストで元のドキュメントが既に変更されています。これは、ドキュメントに新しい_revが追加されたことを意味します
    4. ただし、_revでドキュメントを更新するようにcouchdbにリクエストします つまり、stale 手順1で読んだこと。
    5. Couchdbは例外を生成します。
    6. ドキュメントをもう一度読んで、最新の_revを取得します 更新してみてください。

    したがって、これを行う場合は、常にドキュメントの最新リビジョンに対して更新する必要があります。これにより、状況が少し明確になることを願っています。

    注:

    ダニエルが指摘したように、_rev ルールは一括更新には適用されません。



    1. 外部フィールドがオブジェクトの配列である場合のMongoDBルックアップ

    2. Mongodbがアドレスでの無効なアクセスでクラッシュしました-セグメンテーション違反信号11-バージョン2.6

    3. Mongodb読み取り設定

    4. Mongolabnodejsトポロジが破壊されました