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
- Resumen de MongoDB: Empezando con MongoDB
- Cómo instalar MongoDB en Ubuntu y Mac
- Creación de una base de datos en MongoDB
- Comandos básicos de MongoDB Shell
- MongoDB Compass: Uso de la interfaz gráfica de Mongo
- Explicación del Control de Acceso Basado en Roles (RBAC) de MongoDB
- Explicación de los operadores de proyección y proyección de MongoDB
- Explicación de las funciones agregadas de MongoDB
- Ordenación de MongoDB: método y ejemplos de sort()
- Uso de operadores de Push & Pull en MongoDB
- Cómo utiliza MongoDB $unwind
- 23 operadores comunes de consultas de MongoDB y cómo utilizarlos
- Ejemplos de consultas de geolocalización de MongoDB
- Introducción a las transacciones de MongoDB
- Índices de MongoDB: Principales tipos de índices y cómo gestionarlos
- Mejores comandos de MongoDB te necesitas saber
- Replicación de MongoDB: Una introducción completa
- Cómo configurar un clúster de MongoDB
- Fragmentos de MongoDB: Conceptos, Ejemplos y Tutoriales
- MongoDB Atlas: Configuración y uso de MongoDB gestionado
- Cómo ejecutar MongoDB como contenedor Docker
- Uso, gestión y requisitos de memoria de MongoDB
- Cómo utilizar Mongodump para copias de seguridad de MongoDB
- Ejemplos de Mongorestore para restaurar copias de seguridad de MongoDB
- Cómo utilizar PyMongo
- Cómo utilizar Mongoose para MongoDB y NodeJS
- Chuletas de MongoDB
- MongoDB vs Cassandra: Comparación de bases de datos NoSQL
- PostgreSQL vs MongoDB: Comparando bases de datos
- MySQL vs MongoDB: Comparando bases de datos
- Certificaciones MongoDB: Una introducción
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.