Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Aplica la coherencia de los datos con las transacciones

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.

Para usar transacciones, debes conectarte a un set de réplicas o clúster. No puedes usar transacciones en implementaciones autónomas.

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.

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.

1
use test
db.products.insertMany(
[
{
sellerId: 456,
name: "sweater",
price: 30,
rating: 4.9
},
{
sellerId: 456,
name: "t-shirt",
price: 10,
rating: 4.2
},
{
sellerId: 456,
name: "vest",
price: 20,
rating: 4.7
}
]
)
2
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
}
]
}
)
3

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();

Para confirmar que el precio se actualizó y que los datos son coherentes, query las colecciones products y sellers.

db.products.find( { sellerId: 456, name: "vest" } )

Salida:

[
{
_id: ObjectId("64d506c3ddebf45734d06c58"),
sellerId: 456,
name: 'vest',
price: 25,
rating: 4.7
}
]
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 }
]
}
]

Para ver otras formas de aplicar la coherencia de los datos, consulte:

Volver

Coherencia de datos

En esta página