MongoDB tiene soporte para actualizaciones atómicas. Es decir. Puedo estar seguro de que cuando se actualice un documento, ninguna otra actualización sobrescribirá mi cambio anterior. Mi pregunta se relaciona con la combinación de consulta y declaración de actualización, y se ilustra mejor con el ejemplo que se muestra a continuación.¿Se aplica la atomicidad de actualización de MongoDB tanto a la consulta como a la modificación?
db.foo.update(
{ state : 1, players: { $size: 2 } } ,
{ $push: { players : { new player document } } },
false , true);
En el ejemplo anterior, sólo quieren impulsar un nuevo jugador en una colección de jugadores, si el número de jugadores es igual a 2. Dada la consulta anterior y la instrucción de actualización, es posible que dos cambios simultáneos tanto empujar a un jugador en el mismo documento, porque en el momento de leer el documento, ¿el tamaño de los jugadores $ es 2? Es decir. ¿la atomicidad se extiende a través de la consulta y actualiza parte de la declaración de actualización o no?
Editar Más secuencia en profundidad de los eventos:
Considere disparar la misma actualización dos veces (U1 y U2) al mismo tiempo. ¿Es posible la siguiente secuencia de eventos o no?
- U1 encuentra que el documento # 1 coincide con la parte de consulta de la declaración de actualización .
- U2 encuentra que el documento # 1 coincide con la parte de consulta de la declaración de actualización.
- U1 empuja un nuevo jugador en el documento n. ° 1.
- U2 empuja a un nuevo jugador en el documento n. ° 1.
El resultado final es que el documento # 1 contiene un jugador más de lo esperado, porque tanto U1 como U2 tenían la impresión de que el documento # 1 contiene solo dos jugadores.
Gracias por su respuesta. He actualizado mi pregunta con una secuencia de eventos, que espero aclare un poco. Ahora me doy cuenta de que lo que estoy preguntando no es atomicidad, sino una transacción (bloqueo) a nivel de documento. –
Sí, eso aclara la pregunta. No tienes nada de qué preocuparte. Nada puede alterar el documento entre búsqueda y actualización (pasos 2 y 4) o la operación no sería atómica. Si no funciona de esta manera, entonces es un error y se debe informar como tal. – johndodo