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
/ /

Utiliza la API de Transacciones Convenientes

Puede ejecutar una transacción para ejecutar una serie de operaciones que no cambian los datos hasta que se confirme completamente la transacción. Este ejemplo de uso utiliza la API de Transacciones Convenientes para realizar una transacción.

Tip

Para obtener más información sobre la realización de transacciones en el controlador Node.js, consulte Transactions guide.

El controlador Node.js también proporciona la Core API para realizar transacciones. Para obtener más información sobre la Core API, consulta el Usar la Core API ejemplo de uso.

Considera una situación en la que un cliente compra artículos de tu tienda. Para registrar la compra, tu aplicación debe actualizar tu inventario y registrar la información del pedido.

La siguiente tabla describe las colecciones que almacenan datos de compra y cómo una compra modifica los datos en cada colección.

Colección
Operación
Descripción del cambio

orders

insert

Inserta un documento que describe el pedido.

inventory

update

Actualiza las cantidades de artículos disponibles después de una compra.

La colección inventory contiene los siguientes documentos:

{ item: "sunblock", qty: 85, price: 6.0 },
{ item: "beach chair", qty: 30, price: 25.0 }

Almacena los registros de compra en la colección orders de la base de datos testdb. Esta colección está vacía, ya que no se han realizado compras.

El ejemplo de código de esta sección muestra cómo usar la API de Transacciones Convenientes para realizar una transacción multidocumento en una sesión. En este ejemplo, la transacción realiza los cambios necesarios cuando un cliente compra artículos en su tienda.

Este código de ejemplo realiza una transacción mediante las siguientes acciones:

  1. Llama al método withSession() en el cliente para crear implícitamente la sesión y ejecutar la función de retorno pasada a ella dentro de la sesión.

  2. Llama al método withTransaction() en la sesión para crear una transacción, ejecutar la devolución de llamada que se le pasa y confirmarla. Si la transacción falla, este método la finaliza y devuelve un mensaje de error.

  3. Realiza las siguientes operaciones dentro de la transacción:

    • Actualiza las colecciones inventory y orders si hay suficiente inventario para completar la compra

    • Termina la transacción y lanza una excepción si no hay suficiente inventario para algún artículo del pedido.

    • Devuelve un mensaje reconociendo que la transacción se completó correctamente con una copia del registro de compra

  4. Imprime el tipo de retorno de withSession(), que es o bien el mensaje de error o la confirmación de que la transacción se completó.

const txnResult = await client.withSession(async (session) =>
session
.withTransaction(async (session) => {
const invColl = client.db("testdb").collection("inventory");
const recColl = client.db("testdb").collection("orders");
let total = 0;
for (const item of order) {
/* Update the inventory for the purchased items. End the
transaction if the quantity of an item in the inventory is
insufficient to complete the purchase. */
const inStock = await invColl.findOneAndUpdate(
{
item: item.item,
qty: { $gte: item.qty },
},
{ $inc: { qty: -item.qty } },
{ session }
);
if (inStock === null) {
await session.abortTransaction();
return "Item not found or insufficient quantity.";
}
const subTotal = item.qty * inStock.price;
total = total + subTotal;
}
// Create a record of the purchase
const receipt = {
date: new Date(),
items: order,
total: total,
};
await recColl.insertOne(receipt, { session });
return (
"Order successfully completed and recorded!\nReceipt:\n" +
JSON.stringify(receipt, null, 1)
);
}, null)
.finally(async () => await client.close())
);
console.log(txnResult);

Esta sección describe los resultados de las transacciones realizadas para dos pedidos de muestras.

Existe inventario suficiente para el siguiente pedido, por lo tanto, la transacción se completa con éxito:

{ item: "sunblock", qty: 3 },
{ item: "beach chair", qty: 1 }

Después de pasar esta orden al código de transacción de ejemplo, el código genera el siguiente resultado:

Order successfully completed and recorded!
Receipt:
{
"date": "2023-08-25T20:06:52.564Z",
"items": [
{ "item": "sunblock", "qty": 3 },
{ "item": "beach chair", "qty": 1 }
],
"total": 43,
"_id": "..."
}

En la colección inventory, la cantidad de "sunblock" es ahora 82 y la cantidad de "beach chair" es 29. La colección orders contiene el registro de la compra.

No hay inventario suficiente para el siguiente pedido, por lo que el driver finaliza la transacción:

{ item: "volleyball", qty: 1 }

Después de pasar esta orden al código de transacción de ejemplo, el código genera el siguiente resultado:

Item not found or insufficient quantity.

Dado que el driver termina la transacción, no hay cambios en las colecciones inventory y orders.

Para obtener más información sobre cualquiera de los métodos o tipos tratados en este ejemplo de uso, consulta la siguiente Documentación de la API:

  • conSesión()

  • withTransaction()

  • abortTransaction()"

Volver

Transacciones

En esta página