Session.withTransaction()
Nesta página
Definição
Session.withTransaction( <function> [, <options> ] )
Novidades no mongosh v1.1.0
Executa uma função lambda especificada em uma transação. Se houver um erro, o método tentará novamente:
operação de commit, se houver uma falha no commit.
transação inteira, se o erro permitir.
Importante
Método mongosh
Esta página documenta um método
mongosh
. Esta não é a documentação de comandos de banco de dados nem drivers específicos de linguagem, como Node.js.Para o comando de banco de dados de dados, consulte o comando
commitTransaction
.Para drivers de API do MongoDB, consulte a documentação do driver do MongoDB específica da linguagem.
O método aceita
Session.withTransaction()
as opções de transação.
Comportamento
O driver Node.js tem uma versão do Session.withTransaction()
conhecida como Callback API de chamada. O Callback API
também aceita um retorno de chamada, no entanto, o tipo de retorno para o método Node.js deve ser uma Promessa. O método mongosh
Session.withTransaction()
não requer uma Promessa.
Exemplo
O exemplo a seguir cria a coleta balances
e usa uma transação para transferir dinheiro entre dois clientes.
Crie a coleção balances
:
use accounts db.balances.insertMany( [ { customer: "Pat", balance: Decimal128( "35.88" ) }, { customer: "Sasha", balance: Decimal128( "5.23" ) } ] )
Inicialize algumas variáveis que são usadas na transação:
var fromAccount = "Pat" var toAccount = "Sasha" var transferAmount = 1 var dbName = "accounts" var collectionName = "balances"
Inicie uma sessão e execute uma transação para atualizar as contas:
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 } } ) } )
A função lambda inclui verificações iniciais para validar a operação antes de atualizar a coleção balances
.
O MongoDB conclui automaticamente a transação.
Se ambas as operações
updateOne()
forem bem-sucedidas,Session.withTransaction()
confirmará a transação quando a chamada de resposta retornar.Se uma exceção for lançada dentro da chamada de resposta, o
Session.withTransaction()
encerra a transação e reverte todas as alterações não confirmadas.
Observação
Por padrão, o MongoDB encerra as transações que são executadas por mais de 60 segundos. Se você quiser estender o tempo limite padrão para experimentar com a transação em mongosh
, consulte Limite de tempo de execução.