Docs Menu
Docs Home
/ /

Aplica la coherencia de los datos con las transacciones

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.

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

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.

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.

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

Para confirmar que el precio se actualizó y que los datos son consistentes, consulte 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 garantizar la coherencia de los datos, consulte:

Volver

Coherencia de datos

En esta página