11

まず、Pymongo Documentationで言われていることは次のとおりです

デフォルトでは、スレッドが最初に MongoDB で操作を実行するときに、PyMongo は各スレッドのリクエストを開始します。これにより、**read-your-writes の一貫性が保証されます。リクエスト内では、スレッドは引き続き同じソケットを排他的に使用し、スレッドが end_request() を呼び出すか終了するまで、他のスレッドはこのソケットを使用しません。その時点で、ソケットは接続プールに返され、他のスレッドで使用できるようになります。

Mongodb (Asyncmongo、Motor など) に非同期ライブラリを使用する場合、ユーザーは呼び出しのブロックのような一貫性や結果整合性を持ちますか?

4

2 に答える 2

8

この質問にはいくつかのポイントがあります。

  1. "safe=true", "w=1"(またはそれ以上)を使用するか、書き込みで使用しない限り、書き込み後の読み取りの一貫性は保証されません"j=true"。これらを insert() またはupdate()コマンドの一部として含めることも、使用set_lasterror_options()している接続、データベース、またはコレクションに対してこれらのオプションを設定するために使用することもできます。

  2. セカンダリ ノードからの読み取りを許可している場合 (たとえば、PRIMARY 以外の ReadPreference)、読み取り後書き込みセマンティクスは得られず、結果整合性のみが得られます。

  3. PRIMARY の ReadPreference を使用していて、適切な lasterror オプションを設定している場合、同じソケット (つまり、同じスレッド) を使用するすべての操作で書き込み後読み取りセマンティクスを取得することが保証されます。

  4. 複数のスレッドを使用していて、セカンダリ ノードから読み取っていない場合は、最初のスレッドで書き込みが完了した後に 2 番目のスレッドで読み取りを発行する限り、書き込み後の読み取りの一貫性が保証されます。これを保証するために、標準のスレッド同期プリミティブを使用できます。

于 2012-09-24T19:11:27.770 に答える
3

私はMotorの作者であり、AsyncMongoについても少し知っています。安全な書き込みに関するMotorのドキュメントは次のとおりです。

http://emptysquare.net/motor/pymongo/api/motor/differences.html#acknowledged-writes

簡単な答え:insert()、update()などのコールバックで実行するコードが何であれ、それらの挿入または更新が安全であれば、変更が適用された、 MongoDBのデータが表示されます。このようなコールバック以外で実行するコードは、MongoDBが変更を適用する前または後に実行される可能性があります。

于 2012-10-03T01:09:43.647 に答える