-2

私はmongodbのいくつかのデータを更新したいのですが、私のロジックは次のとおりです:

#find the specific document with "md5,time,size",
if collection.find({"src_md5":file_md5,"src_time":file_time,"src_size":file_size}).count() == 0:
    #if not found
    #   find the idx,if idx is not yet exist,set idx equa 1

    if collection.find({},{"idx":1}).count() == 0:
        idx = 1

    #if idx is alread there, sort idx and get the biggest idx
    else:
        idx = collection.find({},{"idx":1}).sort('idx',-1).limit(5)[0]['idx']
        idx = idx + 1

        #insert the info with idx
        if not self.insertFileInfo(collection,file_obj,file_md5,file_time,file_size,long(idx)):
            return None
#if the specific document with "md5,time,size" is found
else:
#just get the idx with the specific md5
    idx = collection.find({"src_md5":file_md5,"src_time":file_time,"src_size":file_size},{"idx":1})[0]['idx']
    return None

上記のコードを 4 台のマシンで実行します。これは、4 つのプロセスがほぼ同時に mongodb を更新することを意味します。操作のアトミック性を確保するにはどうすればよいですか? 私の記録されたスキーマは

{"src_md5":"djapijfdakfiwqjfkasdj","src_size":2376498,"src_time":1338179291,"idx":1}
{"src_md5":"jdfipajkoijjipjefjidwpj","src_size":234876323,"src_time":1338123873,"idx":2}
{"src_md5":"djapojfkdasxkjipkjkf","src_size":3829874,"src_time":1338127634,"idx":3}

これは単純な自動インクリメント キーではなく、md5、サイズ、時間が変更されたときに増加し、レコードとして挿入する必要があります。{"src_md5","src_time","src_size"} に複合一意インデックスを作成し、{"idx"} に一意インデックスを作成しますが、新しい情報を挿入する前に、idx が既に存在するようにしてから、値を増やしますそれ。2 つの状況があります: 1,特定の md5,size,time を持つ idx が既に存在する場合は、単に idx を返します 2,存在しない場合は、idx を 1 増やします

4

1 に答える 1

2

同様の問題がこの質問で議論されています。

あなたがしたいことは、リンクされた質問で説明されているように、独自のコレクションに保持し、 $inc を使用して増分する単調に増加する一意のキーを持つことに似ています。

これにより、同じ idx を 2 回使用しようとすることがなくなります。現在、2 つのスレッドが (md5,size,time) の新しい組み合わせを 2 つの異なる idx キーで挿入しようとする可能性がまだありますが、2 つ目のスレッドは (md5,size,time) にある一意のインデックスのために失敗します。 .

現在ここに存在する唯一の競合状態は、一意のインデックスが原因で 2 番目のスレッドが挿入に失敗した場合であり、未使用の idx 値になります (つまり、そのたびに idx 値を増やすと 1 つスキップされます)。それはあなたにとってどれほど大きな問題ですか?大きい場合は、アプリケーション コードでロックを強制するか、このケースに対処するためにスキーマの構造を変更する必要があります。

于 2012-05-28T17:23:19.110 に答える