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

Session.withTransaction() (mongosh method)

Session.withTransaction( <function> [, <options> ] )

Nuevo en mongosh v1.1.0

Ejecuta una función lambda específica dentro de una transacción. Si hay un error, el método reintenta:

  • operación de confirmación, si hay una falla al confirmar.

  • la transacción completa, si el error lo permite.

La Session.withTransaction() método acepta las opciones de transacción.

Devuelve:El valor producido por la función de retorno.

Importante

Método mongosh

Esta página documenta un método mongosh. Esta no es la documentación para los comandos de base de datos ni para los drivers específicos de lenguajes, como Nodo.js.

Para el comando de base de datos, consulte el commitTransaction dominio.

Para los drivers de API de MongoDB, consulte la documentación del driver de MongoDB específica del lenguaje.

Este método está disponible en implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

Nota

Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

El controlador de Node.js tiene una versión de Session.withTransaction() conocida como API de devolución Callback API de llamada. también acepta una devolución de llamada; sin embargo, el tipo de retorno del método de Node.js debe ser una Promesa. El mongosh Session.withTransaction() método no requiere una Promesa. Ejemplo -------

El siguiente ejemplo crea la colección balances y utiliza una transacción para transferir dinero entre dos clientes.

Crear la colección balances:

use accounts
db.balances.insertMany( [
{ customer: "Pat", balance: Decimal128( "35.88" ) },
{ customer: "Sasha", balance: Decimal128( "5.23" ) }
] )

Inicializa algunas variables que se utilizan en la transacción:

var fromAccount = "Pat"
var toAccount = "Sasha"
var transferAmount = 1
var dbName = "accounts"
var collectionName = "balances"

Inicie una sesión y luego ejecute una transacción para actualizar las cuentas:

var session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
session.withTransaction( async() => {
const sessionCollection = session.getDatabase(dbName).getCollection(collectionName);
// Check needed values
var checkFromAccount = sessionCollection.findOne(
{
"customer": fromAccount,
"balance": { $gte: transferAmount }
}
)
if( checkFromAccount === null ){
throw new Error( "Problem with sender account" )
}
var checkToAccount = sessionCollection.findOne(
{ "customer": toAccount }
)
if( checkToAccount === null ){
throw new Error( "Problem with receiver account" )
}
// Transfer the funds
sessionCollection.updateOne(
{ "customer": toAccount },
{ $inc: { "balance": transferAmount } }
)
sessionCollection.updateOne(
{ "customer": fromAccount },
{ $inc: { "balance": -1 * transferAmount } }
)
} )

La función lambda incluye comprobaciones iniciales para validar la operación antes de actualizar la colección balances.

MongoDB completa automáticamente la transacción.

  • Si ambas operaciones de updateOne() tienen éxito, Session.withTransaction() confirma la transacción cuando la función de retorno devuelve.

  • Si se produce una excepción dentro de la función de retorno, Session.withTransaction() finaliza la transacción y revierte cualquier cambio no confirmado.

Nota

Por defecto, MongoDB finaliza las transacciones que se ejecutan durante más de 60 segundos. If you want to extend the por defecto timeout to experiment with transacciones in mongosh, see Runtime Limit.

Volver

Sesión.startTransaction()

En esta página