Puedes utilizar Transacciones para garantizar la coherencia entre colecciones que contienen datos duplicados. Las transacciones actualizan varias colecciones en una sola operación atómica.
Utilice transacciones para garantizar la coherencia si su aplicación debe devolver siempre datos actualizados y puede tolerar un posible impacto negativo en el rendimiento durante períodos de lecturas intensas.
Las transacciones podrían no ser tan eficientes como otros métodos para garantizar la consistencia de los datos. El rendimiento de lectura podría verse afectado negativamente mientras una transacción está abierta. Sin embargo, las transacciones garantizan que los datos leídos por el cliente estén siempre actualizados.
Acerca de esta tarea
Para usar transacciones, debes conectarte a un set de réplicas o clúster. No puedes usar transacciones en implementaciones autónomas.
Antes de comenzar
Revise los diferentes métodos para garantizar la consistencia de los datos y garantizar que las transacciones sean la mejor opción para su aplicación. Para más información, consulte Consistencia de datos.
Pasos
El siguiente ejemplo refuerza la coherencia de los datos en una aplicación de comercio electrónico. El esquema de ejemplo duplica la información del producto en el
products y colecciones sellers. Este diseño de esquema optimiza las consultas tanto para productos como para vendedores.
Cuando se actualiza un producto, por ejemplo, cuando cambia su precio, es fundamental que el precio sea consistente en las colecciones products y sellers. Por lo tanto, las transacciones son un método razonable para garantizar la consistencia de los datos en esta aplicación.
Crear la colección de vendedores
use test db.sellers.insertOne( { id: 456, name: "Cool Clothes Co", location: { address: "21643 Andreane Shores", state: "Ohio", country: "United States" }, phone: "567-555-0105", products: [ { name: "sweater", price: 30 }, { name: "t-shirt", price: 10 }, { name: "vest", price: 20 } ] } )
Configurar una transacción para manejar actualizaciones
Nota
El siguiente ejemplo utiliza una transacción en mongosh. Para ver ejemplos de transacciones para controladores MongoDB, consulte Transacciones.
El siguiente ejemplo utiliza una transacción para actualizar el precio de vest en las colecciones products y sellers:
// Start a session session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); productsCollection = session.getDatabase("test").products; sellersCollection = session.getDatabase("test").sellers; // Start a transaction session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } ); // Operations inside the transaction try { productsCollection.updateOne( { sellerId: 456, name: "vest" }, { $set: { price: 25 } } ); sellersCollection.updateOne( { }, { $set: { "products.$[element].price": 25 } }, { arrayFilters: [ { "element.name": "vest" } ] } ); } catch (error) { // Cancel transaction on error session.abortTransaction(); throw error; } // Commit the transaction using write concern set at transaction start session.commitTransaction(); session.endSession();
Resultados
Para confirmar que el precio se actualizó y que los datos son consistentes, consulte las colecciones products y sellers.
Consultar la Colección de Productos
db.products.find( { sellerId: 456, name: "vest" } )
Salida:
[ { _id: ObjectId("64d506c3ddebf45734d06c58"), sellerId: 456, name: 'vest', price: 25, rating: 4.7 } ]
Consultar la Colección de Vendedores
db.sellers.find( { id: 456, "products.name": "vest" } )
Salida:
[ { _id: ObjectId("64d516d9ddebf45734d06c5a"), id: 456, name: 'Cool Clothes Co', location: { address: '21643 Andreane Shores', state: 'Ohio', country: 'United States' }, phone: '567-555-0105', products: [ { name: 'sweater', price: 30 }, { name: 't-shirt', price: 10 }, { name: 'vest', price: 25 } ] } ]
Obtén más información
Para ver otras formas de garantizar la coherencia de los datos, consulte: