MongoDB Academy · Lección

Garantías ACID en un almacén de documentos distribuido

Relacionará las cuatro propiedades ACID con el motor de almacenamiento de MongoDB y comprenderá cuáles se proporcionan de forma predeterminada en el nivel de un solo documento.

Lección 1 de 413 pasos

Garantías ACID en un almacén de documentos distribuido es una lección gratuita de MongoDB Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de MongoDB Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de MongoDB Academy incluye 4 lecciones en total.

Qué significa ACID para las bases de datos

ACID son las siglas de Atomicidad, Consistencia, Aislamiento y Durabilidad: cuatro propiedades que garantizan el procesamiento fiable de las operaciones de base de datos. Estas propiedades se definieron originalmente para las bases de datos relacionales tradicionales, pero son igualmente importantes en los almacenes de documentos. Comprender cómo MongoDB proporciona cada propiedad (o qué compromisos implica) le ayuda a diseñar modelos de datos y operaciones que cumplan los requisitos de fiabilidad de su aplicación.

Atomicidad: todo o nada

La atomicidad garantiza que un conjunto de operaciones se complete por completo o falle por completo; no existe un estado parcial. En MongoDB, las operaciones sobre un solo documento son siempre atómicas. Cuando llama a updateOne con varios operadores de actualización, el cambio completo se aplica como una única unidad atómica. Esto es posible porque todos los datos de un documento suelen almacenarse juntos en el disco con el formato BSON.

// This entire updateOne is atomic — both fields change together or neither does
db.accounts.updateOne(
  { _id: accountId },
  {
    $inc: { balance: -100 },
    $push: { transactions: { type: 'debit', amount: 100, date: new Date() } }
  }
)

Atomicidad de un solo documento frente a varios documentos

MongoDB garantiza la atomicidad de forma predeterminada en el nivel de un solo documento. Como un documento puede contener matrices integradas y objetos anidados, a menudo puede modelar como un solo documento lo que serían varias filas SQL y obtener actualizaciones atómicas sin esfuerzo adicional. La atomicidad entre varios documentos requiere transacciones explícitas de varios documentos (disponibles desde MongoDB 4.0 en conjuntos de réplicas). Comprender esta diferencia le ayudará a tomar decisiones sobre el modelado de datos.

// No transaction needed: order + line items in one document = atomic
db.orders.insertOne({
  _id: orderId,
  customerId: customerId,
  status: 'pending',
  items: [
    { productId: 'P1', qty: 2, price: 29.99 },
    { productId: 'P2', qty: 1, price: 49.99 }
  ],
  total: 109.97
})

Consistencia: transiciones entre estados válidos

La consistencia significa que la base de datos siempre pasa de un estado válido a otro. En MongoDB, la consistencia se aplica mediante validadores de JSON Schema (tipos de campo, campos obligatorios y valores de enumeración), índices únicos (sin valores duplicados) e invariantes del nivel de la aplicación. A diferencia de los RDBMS tradicionales, MongoDB no aplica claves foráneas de forma nativa; el código de la aplicación o el diseño del esquema deben mantener la integridad referencial.

// JSON Schema validator enforces consistency constraints
db.createCollection('users', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['email', 'role'],
      properties: {
        email: { bsonType: 'string' },
        role: { enum: ['admin', 'user', 'guest'] }
      }
    }
  }
})

Aislamiento: comportamiento de las operaciones simultáneas

El aislamiento controla cómo las operaciones simultáneas ven los cambios de las demás. MongoDB utiliza aislamiento mediante instantáneas para las transacciones de varios documentos: una transacción ve una instantánea coherente de los datos tal como estaban cuando comenzó la transacción. Fuera de las transacciones, las lecturas individuales pueden ver inmediatamente los cambios confirmados de otras operaciones; esto se denomina aislamiento de lectura confirmada. Las preferencias de lectura en los conjuntos de réplicas afectan a la instantánea desde la que se lee.

// Inside a transaction, a consistent snapshot is maintained
const session = client.startSession();
session.startTransaction();
try {
  // These two reads see the SAME snapshot even if other writers commit between them
  const inventory = await db.collection('inventory').findOne({ _id: itemId }, { session });
  const order = await db.collection('orders').findOne({ _id: orderId }, { session });
  // ...
  await session.commitTransaction();
} finally {
  await session.endSession();
}

Durabilidad: sobrevivir a los fallos

La durabilidad garantiza que, una vez confirmada una operación, esta persista incluso si el sistema se bloquea. MongoDB logra la durabilidad mediante el diario de WiredTiger: las escrituras se registran en un diario antes de aplicarse a los archivos de datos. La opción writeConcern permite controlar el nivel de durabilidad: w:1 confirma cuando un nodo realiza la escritura, mientras que w:majority espera hasta que la mayoría de los miembros del conjunto de réplicas haya persistido la escritura.

// w:majority ensures write survives even if the primary fails
db.payments.insertOne(
  { orderId: orderId, amount: 99.99, status: 'completed' },
  { writeConcern: { w: 'majority', j: true } }
  // j:true = wait for journal flush on disk
)

Las escrituras de un solo documento siempre son duraderas

Para las operaciones sobre un solo documento en un conjunto de réplicas con la preocupación de escritura predeterminada, MongoDB espera a que el nodo primario confirme la escritura antes de responder. Si la operación incluye j:true, también espera a que el diario se vacíe en el disco. Esto significa que las escrituras de un solo documento son duraderas tanto frente a bloqueos del nodo primario (conmutación por error del conjunto de réplicas) como frente a fallos del disco (el diario garantiza que no se pierdan datos al reiniciar).

// Default write concern on Atlas: {w: 'majority'} — already durable
// Explicitly requesting journal flush:
await db.collection('criticalAuditLog').insertOne(
  { event: 'payment', userId: userId, timestamp: new Date(), amount: 500 },
  { writeConcern: { w: 'majority', j: true } }
);

La ventaja de los documentos integrados para ACID

Una de las ideas clave del diseño de MongoDB es que integrar los datos relacionados en un solo documento elimina la necesidad de transacciones de varios documentos en muchos casos. Un pedido con sus líneas, una publicación de blog con sus comentarios o el perfil de un usuario con sus direcciones son documentos individuales y, por tanto, obtienen actualizaciones atómicas, consistentes, aisladas y duraderas sin coste adicional, sin la sobrecarga de una transacción.

// Updating shipping address + logging the change:
// One atomic write — no transaction needed
await db.collection('users').updateOne(
  { _id: userId },
  {
    $set: { 'address.street': '123 Main St', 'address.city': 'Austin' },
    $push: {
      addressHistory: {
        changedAt: new Date(),
        previous: oldAddress
      }
    }
  }
)

Cuándo necesita ACID para varios documentos

Hay situaciones en las que la integración no funciona y es necesario aplicar ACID a varios documentos. Las transferencias financieras entre dos documentos de cuenta independientes (cargar uno y abonar otro) requieren atomicidad entre ambos documentos. La reserva de inventario (reducir las existencias en una colección y crear un pedido en otra) necesita aislamiento. Las actualizaciones de un libro mayor distribuido en muchos registros requieren garantías de todo o nada. Para estos patrones, las transacciones de varios documentos de MongoDB 4.0 o posteriores son la solución.

// Without a transaction, a crash between these two writes
// leaves the database in an inconsistent state (money debited but not credited):
await db.collection('accounts').updateOne({ _id: fromId }, { $inc: { balance: -100 } });
// <--- system crash here means money is lost!
await db.collection('accounts').updateOne({ _id: toId }, { $inc: { balance: 100 } });

// With a transaction, both succeed or both roll back.

ACID frente a BASE: un continuo

No todas las bases de datos NoSQL proporcionan garantías ACID. Muchos sistemas NoSQL iniciales eligieron BASE (Basically Available, Soft state, Eventually consistent: disponibilidad básica, estado flexible y consistencia eventual) para lograr un mayor rendimiento de escritura y disponibilidad entre nodos distribuidos. MongoDB se presenta como una solución que ofrece ACID en el nivel de documento de forma predeterminada y ACID completo para transacciones de varios documentos cuando se solicita: un punto intermedio entre los RDBMS estrictos y los almacenes puramente basados en la consistencia eventual.

Leer las propias escrituras: consistencia causal

En los conjuntos de réplicas distribuidos, es posible que una escritura en el nodo primario y una lectura posterior desde un nodo secundario todavía no reflejen esa escritura; esto es una anomalía de consistencia. La función de consistencia causal de MongoDB (disponible mediante sesiones) garantiza que las operaciones dentro de una sesión vean los efectos de todas las operaciones anteriores de esa misma sesión, incluso entre servidores distintos. Esto es fundamental para que la aplicación se comporte correctamente después de realizar escrituras.

// Causal consistency: guaranteed to read your own writes within a session
const session = client.startSession({ causalConsistency: true });
await db.collection('settings').updateOne(
  { _id: userId }, { $set: { theme: 'dark' } }, { session }
);
// This read is guaranteed to see the update above, even on a secondary:
const settings = await db.collection('settings').findOne({ _id: userId }, { session });
await session.endSession();

Comprobación rápida

Compruebe su comprensión de los conceptos de MongoDB y las bases de datos NoSQL de esta lección.

Resumen de la lección

En esta lección ha aprendido: todas las operaciones sobre un solo documento en MongoDB cumplen plenamente con ACID de forma predeterminada, la atomicidad en el nivel de documento elimina la necesidad de usar transacciones en muchos casos, y las transacciones ACID de varios documentos (MongoDB 4.0 o posteriores) resuelven los casos en los que la integración no resulta práctica, como las transferencias financieras entre documentos independientes. A continuación, exploraremos cómo abrir sesiones y escribir transacciones de varios documentos.

Gratis para empezar

Aprende JavaScript con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
30
Lecciones
120

Preguntas frecuentes

¿La lección «Garantías ACID en un almacén de documentos distribuido» es gratis?

Sí — el texto completo de «Garantías ACID en un almacén de documentos distribuido» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de MongoDB Academy, actualiza a CoddyKit PRO. El curso de MongoDB Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Garantías ACID en un almacén de documentos distribuido»?

Relacionará las cuatro propiedades ACID con el motor de almacenamiento de MongoDB y comprenderá cuáles se proporcionan de forma predeterminada en el nivel de un solo documento. Practicas MongoDB Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar MongoDB Academy?

No se requiere experiencia previa. MongoDB Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Garantías ACID en un almacén de documentos distribuido»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de MongoDB Academy?

Sí. Cada lección de MongoDB Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Garantías ACID en un almacén de documentos distribuido
  2. Inicio de una sesión y una transacción de varios documentos
  3. Gestión de errores y lógica de reintento
  4. Consideraciones de rendimiento de las transacciones
← Volver a MongoDB Academy