Introducción a las transacciones de MongoDB

Introducción a las transacciones de MongoDB

  • Orquestación
6 min de lectura Actualizado Apr 26, 2019

Puntos clave: Las transacciones de MongoDB aseguran la coherencia de los datos agrupando operaciones, crucial para escenarios como las ventas. Requieren replicación y una configuración en clúster, pero pueden afectar al rendimiento, haciendo que la incrustación de documentos sea una alternativa más eficiente.

  • Las transacciones son vitales para mantener la integridad de los datos.
  • Considera incrustar documentos para mejorar el rendimiento.

En informática son los conceptos ACID (Atomicidad, Consistencia, Aislamiento, Durabilidad), integridad atómica e referencial. Qué término conoces depende en gran medida de tu edad. Yo sé el último, que te da una pista para pensar que sí lo soy.

Básicamente, todos estos términos significan lo mismo: significa que el ordenador debe expulsar cualquier transacción que resulte en un conjunto de transacciones lógicamente inconsistentes.

¿Por qué es esto importante?

Imagina que te tiene un sistema de control de órdenes de venta e inventario. Cuando te Haz una venta, debería Reduce inventario disponible. Pero, ¿qué pasa si la transacción de venta funciona y luego la actualización de inventario falla? Entonces la base de datos dejaría de ser consistente: el inventario no coincidiría con las ventas.

La forma de evitar eso está agrupando las dos transacciones en una transacción mayor. Los programadores de bases de datos de Oracle conocen esto como las sentencias de inicio y commit. MongoDB soporta el mismo concepto, que ilustramos a continuación.

Impacto en el rendimiento

Aunque MongoDB soporta transacciones, enfatiza que, debido a problemas de rendimiento, es mejor incrustar documentos como arrays JSON. En otras palabras, poner todos los datos de un elemento y sus datos asociados en un solo documento.

Los programadores de Oracle dirían que eso da como resultado una base de datos que no está normalizada. Pero eso no importa, ya que las bases de datos de big data han eliminado ese concepto, diciendo que está bien almacenar los mismos datos en dos registros, ya que su enfoque está en la velocidad y que usar espacio extra en disco para almacenar algo dos veces no importa, ya que el almacenamiento se vuelve más barato que en la época de los mainframes y los servidores Solaris.

En otras palabras, está bien tener el código postal 29607 y la palabra Greenville, SC en dos registros. No te necesitas mantener una tabla de códigos postales como entidad separada, como te haría con el enfoque de RDBMS.

Transacciones Ilustradas

te necesitas una instalación de MongoDB en clúster para hacer esto, pero te puedes fingir te tienes un clúster con solo un servidor en tu portátil. Solo haz como si las réplicas son fuera de línea, instalando solo un nodo. En otras palabras, sigue estas instrucciones que escribimos, pero elimina la sección en /etc/mongodConfig.conf como se muestra abajo, y configura solo un servidor.

    sharding:
  clusterRole: configsvr

Para utilizar transacciones te debes activar la replicación y desactivar el fragmentado. El soporte para bases de datos fragmentadas viene con MongoDB 4.2. A continuación utilizamos la 4.0.5.

Crea algunos datos

Abre la shell de Mongo y Crea los productos y colecciones de ventas, luego añade un producto al inventario. Añadimos 100 artículos de producto 123.

    use products
db.createCollection("products")
db.createCollection("sales")
db.products.insert({product: 123, count: 100})

Ahora, vende 4 artículos del producto 123. El resultado serían 96 artículos restantes en inventario. Así que añade una transacción de venta y actualiza el recuento de inventario a 96 que se muestra a continuación.

O bien pegas ese código en el shell de MongoDB o lo guardas en un archivo de texto JavaScript y luego lo ejecutas con load('<nombre del archivo>').

    session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );

productsCollection = session.getDatabase("products").products;
salesCollection = session.getDatabase("products").sales;

session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );

try {
   salesCollection.insertOne( { 
        product: 123, 
        count: 4
        }
     );
   productsCollection.update(
   { product: 123 },
   { $set:
      {
        count: 96
       }
   }
);

} catch (error) {
   session.abortTransaction();
   throw error;
}

session.commitTransaction();

session.endSession();

Explicación del Código

Primero, prueba que está trabajada:

    db.products.findOne();
{
	"_id" : ObjectId("5cb8ccb664ae78fe855e9431"),
	"product" : 123,
	"count" : 96
}

Las partes clave del código son:

sesión.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "mayority" } } ); Comienza la transacción.

sesión.commitTransaction();

sesión.finSesión();

Commit transacción. Solo llegará aquí si las transacciones entre las dos sentencias funcionaron gracias al bloque try-catch .
sesión.abortTransaction() Significa que no se compromete ninguna de las dos transacciones.
productsCollection.update( { producto: 123 }, { $set: { Recuento: 96 } } )

El formato de esto están db.collection.update (consulta para encontrar el registro, qué campos actualizar).

Actualizamos el producto 123 y establecemos el recuento en 96.

Resolución de problemas

Si te son intentando hacer esto con tu instalación actual y no activaste la replicación ni el sharding o hiciste algunas afirmaciones ilógicas en tu código, te Obtén alguno de estos errores:

  • Los números de transacción solo son permitidos en un miembro de conjunto réplica o en mongos.
  • Las transacciones multidocumento no pueden ejecutarse en un clúster fragmentado a menos que se utilice la versión 4.2.
  • Las transacciones solo son compatibles en featureCompatibilityVersión 4.0. Ve http://dochub.mongodb.org/core/4.0-feature-compatibility para más información.

Guía de MongoDB

  1. Resumen de MongoDB: Empezando con MongoDB
  2. Cómo instalar MongoDB en Ubuntu y Mac
  3. Creación de una base de datos en MongoDB
  4. Comandos básicos de MongoDB Shell
  5. MongoDB Compass: Uso de la interfaz gráfica de Mongo
  6. Explicación del Control de Acceso Basado en Roles (RBAC) de MongoDB
  7. Explicación de los operadores de proyección y proyección de MongoDB
  8. Explicación de las funciones agregadas de MongoDB
  9. Ordenación de MongoDB: método y ejemplos de sort()
  10. Uso de operadores de Push & Pull en MongoDB
  11. Cómo utiliza MongoDB $unwind
  12. 23 operadores comunes de consultas de MongoDB y cómo utilizarlos
  13. Ejemplos de consultas de geolocalización de MongoDB
  14. Introducción a las transacciones de MongoDB
  15. Índices de MongoDB: Principales tipos de índices y cómo gestionarlos
  16. Mejores comandos de MongoDB te necesitas saber
  17. Replicación de MongoDB: Una introducción completa
  18. Cómo configurar un clúster de MongoDB
  19. Fragmentos de MongoDB: Conceptos, Ejemplos y Tutoriales
  20. MongoDB Atlas: Configuración y uso de MongoDB gestionado
  21. Cómo ejecutar MongoDB como contenedor Docker
  22. Uso, gestión y requisitos de memoria de MongoDB
  23. Cómo utilizar Mongodump para copias de seguridad de MongoDB
  24. Ejemplos de Mongorestore para restaurar copias de seguridad de MongoDB
  25. Cómo utilizar PyMongo
  26. Cómo utilizar Mongoose para MongoDB y NodeJS
  27. Chuletas de MongoDB
  28. MongoDB vs Cassandra: Comparación de bases de datos NoSQL
  29. PostgreSQL vs MongoDB: Comparando bases de datos
  30. MySQL vs MongoDB: Comparando bases de datos
  31. Certificaciones MongoDB: Una introducción

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de Orquestación

Suscríbete al Informe

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Gracias te

Tú te has suscrito a The Brief
El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.