Puede usar transacciones para aplicar 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 pueden no ser tan eficaces como otros métodos para aplicar la coherencia 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
Revisa los diferentes métodos para aplicar la coherencia de datos y garantizar que las transacciones sean el mejor enfoque para la aplicación. Para más información, consultar Coherencia de datos.
Pasos
El siguiente ejemplo aplica 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 sellers colecciones. Este diseño de esquema optimiza las queries tanto para productos como para vendedores.
Cuando se actualiza un producto, como cuando cambia su precio, es fundamental que el precio sea coherente en las colecciones products y sellers. Por lo tanto, las transacciones son un método razonable para aplicar la coherencia de 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 } ] } )
Configura una transacción para gestionar 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 del 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 coherentes, query las colecciones products y sellers.
Query la colección Products
db.products.find( { sellerId: 456, name: "vest" } )
Salida:
[ { _id: ObjectId("64d506c3ddebf45734d06c58"), sellerId: 456, name: 'vest', price: 25, rating: 4.7 } ]
Query la colección Sellers
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 aplicar la coherencia de los datos, consulte: