Atomicidad
En MongoDB, una operación de escritura es atómico a nivel de un solo documento, incluso si la operación modifica múltiples documentos incrustados dentro de un solo documento.
Transacciones multi-documento
Cuando se realiza una sola operación de escritura (por ejemplo,
db.collection.updateMany()) modifica múltiples documentos, la modificación de cada documento es atómica, pero la operación en su conjunto no es atómica.
Al realizar Operaciones de guardado multidocumento, ya sea a través de una sola Operación de guardado o de múltiples Operaciones de guardado, otras Operaciones pueden intercalarse.
Para situaciones que requieren atomicidad de las lecturas y escrituras en varios documentos (en una sola colección o en varias), MongoDB admite transacciones distribuidas, incluidas las transacciones en sets de réplica y clústeres fragmentados.
Para obtener más información, consulta transacciones
Importante
En la mayoría de los casos, una transacción distribuida incurre en un costo de rendimiento mayor que las escrituras de documentos individuales, y la disponibilidad de transacciones distribuidas no debería ser un sustituto para un diseño de esquema efectivo. Para muchos casos, el modelo de datos desnormalizado (documento incrustado y matrices) seguirá siendo óptimo para tus datos y casos de uso. Es decir, en muchos casos, modelar tus datos de forma adecuada minimizará la necesidad de transacciones distribuidas.
Para consideraciones adicionales sobre el uso de transacciones (como el límite de tiempo de ejecución y el límite de tamaño del oplog), consulta también las consideraciones de producción.
Control de concurrencia
El control de concurrencia permite que varias aplicaciones se ejecuten simultáneamente sin ocasionar conflictos ni incoherencias de datos.
Una operación en findAndModify un documento es atómica: si la condición de búsqueda coincide con un documento, la actualización se realiza en ese documento. Las consultas simultáneas y las actualizaciones adicionales en ese documento no se ven afectadas hasta que se complete la actualización actual.
Considera el siguiente ejemplo:
Una colección con dos documentos:
db.myCollection.insertMany( [ { _id: 0, a: 1, b: 1 }, { _id: 1, a: 1, b: 1 } ] ) Dos de las siguientes operaciones
findAndModifyse ejecutan simultáneamente:db.myCollection.findAndModify( { query: { a: 1 }, update: { $inc: { b: 1 }, $set: { a: 2 } } } )
Una vez findAndModify completadas las operaciones, se garantiza que a y b en ambos documentos se establezcan 2 en.
También puede crear un índice único en un campo para que solo pueda tener valores únicos. Esto evita que las inserciones y actualizaciones creen datos duplicados. Puede crear un índice único en varios campos para garantizar que la combinación de valores de campo sea única. Para ver un ejemplo, consulte findAndModify() Upsert con índice único.