Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / / /

Session.withTransaction()

Nesta página

  • Definição
  • Comportamento
  • Exemplo
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.

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.

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.

Voltar

Session.startTransaction()