Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Conceptos CRUD

Atomicidad y transacciones

En MongoDB, una operación de guardar es atómico a nivel de un solo documento, incluso si la operación modifica múltiples documentos incrustados dentro de un solo documento.

Cuando se realiza una sola operación de escritura (por ejemplo, db.collection.updateMany()) modifica varios documentos, la modificación de cada documento es atómica, pero la operación en su conjunto no lo es.

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.

El control de concurrencia permite que varias aplicaciones se ejecuten simultáneamente sin ocasionar conflictos ni incoherencias de datos.

Una findAndModify operación sobre 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 concurrentes 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 findAndModify se 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.

Tip

También puedes crear un índice único en un campo para que solo pueda tener valores únicos. Esto previene que las inserciones y actualizaciones creen datos duplicados. Puede crear un índice único en varios campos para garantizar la combinación única de valores de campo. Para un ejemplo, vea findAndModify() Inserción con índice único.

Volver

Analizar el rendimiento

En esta página