2

私は Web アプリで pymongo を使用しており、次のような形で何かをしたいと考えています。

doc = collection.find(document)
doc.array1.append('foo')
for(y in doc.array2): <do things with y>
doc.array2 = filter(lambda x: ..., doc.array2)
doc.x = len(doc.array2)
collection.save(doc)

同じドキュメントを処理する複数のリクエストを処理し、古いバージョンを編集しているために別の結果を上書きしたり、無効になったりするのを防ぐ簡単な方法はありますか?

4

2 に答える 2

6

Atomic Operationsに関する mongodb ドキュメントのセクションを見てください。

あなたが興味を持っているかもしれないセクションは、まだ最新の場合の更新に関する部分です。

  1. オブジェクトをフェッチします。
  2. オブジェクトをローカルで変更します。
  3. 「オブジェクトがまだ古い値と一致する場合は、この新しい値にオブジェクトを更新してください」という更新リクエストを送信します。

操作が失敗した場合は、手順 1 からやり直します。

これは、実行する操作が多数あり、データベースのロックを保持したくない場合のアプローチです。彼らはまた、そのドキュメントで、ロックを保持することに一般的にどのように反対しているかについても述べています。

于 2012-07-16T00:24:56.780 に答える
0

アプリケーション レベルでドキュメント ロックを実装できます。

使用シナリオ:

with DocumentLock(doc_id):
  # DocumentLock makes sure no other thread interferes
  doc=db.doc_collection.find_one(doc_id)
  ... # analyse and update the document
  db.doc_collection.save(doc)

マルチスレッド アプリケーション用の DocumentLock クラスを実装し、ここで公開しました。

この悲観的ロックは、公式ドキュメントで推奨されている楽観的ロックよりもはるかに使いやすいです。また、特定の条件下ではより効率的です(また、他の条件下では非常に非効率的である可能性があるため、使用する前に考えて評価する必要があります)。

于 2013-11-23T19:08:46.447 に答える