Definición
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 se produce un fallo en la confirmación.
toda la transacción, si el error lo permite.
El
Session.withTransaction()Elmétodo acepta las opciones de transacción.Devuelve: El valor producido por la función de devolución de llamada. 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
commitTransactiondominio.Para los drivers de API de MongoDB, consulte la documentación del driver de MongoDB específica del lenguaje.
Comportamiento
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" ) } ] )
Inicializar 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
updateOne()tienen éxito,Session.withTransaction()confirma la transacción cuando regresa la devolución de llamada.Si se lanza una excepción dentro de la devolución de llamada,
Session.withTransaction()finaliza la transacción y revierte cualquier cambio no confirmado.
Nota
De forma predeterminada, MongoDB finaliza las transacciones que se ejecutan durante más de 60 segundos. Si desea ampliar el tiempo de espera predeterminado para experimentar con transacciones mongosh en, consulte Límite de tiempo de ejecución.