2012-09-22 12 views
9

primera, está lo que se dice aquí en Pymongo Documentation-su-propio-escribe la consistencia en MongoDB

Por defecto, PyMongo inicia una solicitud para cada hilo cuando el hilo se ejecuta por primera vez una operación en MongoDB. Esto garantiza ** consistencia de lectura-escritura con. Dentro de una solicitud, el hilo continuará utilizando el mismo zócalo exclusivamente, y ningún otro hilo usará este zócalo, hasta que el hilo invoque end_request() o finalice. En ese punto, el socket se devuelve al grupo de conexiones para su uso por otros hilos.

por lo que cuando el uso de una biblioteca asíncrona a MongoDB (como Asyncmongo, motor), el usuario será tener una consistencia como la de bloqueo de llamadas o una consistencia eventual?

Respuesta

6

Hay un par de puntos sobre esta pregunta.

  1. No está garantizado para tener lectura tras escribir consistencia a menos que estés utilizando "safe=true", "w=1" (o superior) o "j=true" con su escritura. Puede incluirlos como parte de los comandos insert() o update(), o bien usar set_lasterror_options() para establecer estas opciones para la conexión, base de datos o colección que está utilizando.

  2. Si permite lecturas de nodos secundarios (por ejemplo, una referencia de lectura distinta de PRIMARIO), no obtendrá la semántica de lectura después de escritura, sino solo la consistencia final.

  3. Si está utilizando un ReadPreference de PRIMARY y está configurando las opciones apropiadas de lasterror, entonces tiene la garantía de obtener semántica de lectura-escritura en todas las operaciones que usan el mismo socket, es decir, el mismo hilo.

  4. Si está utilizando múltiples hilos, y usted no está leyendo desde los nodos secundarios, a continuación, tiene la garantía de obtener lectura tras escribir consistencia, siempre y cuando se emite la lectura en el segundo hilo después de la escritura completa en el primer hilo Puede usar primitivas de sincronización de subprocesos estándar para asegurar esto.

+0

creo que le dan todas las posibilidades: D estoy usando mongodb con tornado, y en el tornado se trata de un ciclo de eventos, así que es una manera difícil de conseguir roscas, por lo que lo acerca de las bibliotecas Asynch (eso No hilos de uso) –

+1

Umm ... depende de la biblioteca de asynch que estés usando. Se aplican las mismas reglas: solo se garantiza que leerá lo que escribió una vez que el comando getLastError() regrese con éxito. Una vez que haya obtenido un retorno exitoso de getLastError(), cualquier hilo que inicie un find() verá los datos escritos. La sincronización entre hilos se deja como un ejercicio para el lector. –

+0

Creo que es la respuesta, ya que está hablando de manera general, así que solo tengo que ver cómo funciona Motor o Asyncmongo: D gracias de nuevo –

3

Soy el autor de Motor y sé un poco sobre AsyncMongo también. Aquí está la documentación del motor en relación con las escrituras seguras:

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

Respuesta corta: Cualquiera que sea el código se ejecuta en una llamada de retorno para insertar(), update(), etc., si esas inserciones o actualizaciones son segura, veremos los datos en MongoDB después de se ha aplicado el cambio. Cualquier código que ejecute no en dicha devolución de llamada puede ejecutarse antes o después de que MongoDB haya aplicado el cambio.

+0

gracias: D por cierto, Motor usará TODAS las consultas de pymongo, excepto que lo haga de manera asíncrona? –

+1

Correcto, esa es la intención. =) –

+0

y me encanta esta intención;) –

Cuestiones relacionadas