Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Lidar com transações em aplicativos com a API de driver

A API de retorno de chamada:

The Core API:

  • Requer chamada explícita para iniciar a transação e confirmar a transação.

  • Does not incorporate error handling logic for TransientTransactionError and UnknownTransactionCommitResult, and instead provides the flexibility to incorporate custom error handling for these errors.

A API de retorno de chamada incorpora lógica:

Starting in MongoDB 6.2, the server does not retry the transaction if it receives a TransactionTooLargeForCache error.

A API de transação principal não incorpora lógica de repetição para erros rotulados:

O exemplo a seguir incorpora a lógica para tentar novamente a transação em caso de erros transitórios e tentar novamente o commit em caso de erro de commit desconhecido:

Independentemente do sistema de banco de dados, seja MongoDB ou bancos de dados relacionais, os aplicativos devem tomar medidas para lidar com erros durante confirmações de transações e incorporar lógica de repetição para transações.

As operações de gravação individuais dentro da transação não podem ser repetidas, independentemente do valor de retryWrites. Se uma operação encontrar um erro associado ao rótulo "TransientTransactionError", como quando o primário é interrompido, a transação como um todo poderá ser repetida.

  • A API de retorno de chamada incorpora lógica de repetição para "TransientTransactionError".

  • The core transaction API does not incorporate retry logic for "TransientTransactionError". To handle "TransientTransactionError", applications should explicitly incorporate retry logic for the error. To view an example that incorporates retry logic for transient errors, see Core API Example.

As operações de confirmação são operações de gravação repetível. Se a operação de confirmação encontrar um erro, os drivers do MongoDB tentarão repetir a confirmação, independentemente do valor deretryWrites.

Se a operação de commit encontrar um erro rotulado "UnknownTransactionCommitResult", o commit poderá ser repetido.

  • A API de retorno de chamada incorpora lógica de repetição para "UnknownTransactionCommitResult".

  • The core transaction API does not incorporate retry logic for "UnknownTransactionCommitResult". To handle "UnknownTransactionCommitResult", applications should explicitly incorporate retry logic for the error. To view an example that incorporates retry logic for unknown commit errors, see Core API Example.

Novidades na versão 6.2.

Iniciando no MongoDB 6.2, o servidor não tenta novamente a transação se receber um erro TransactionTooLargeForCache. Este erro significa que o cache é muito pequeno e uma nova tentativa provavelmente falhará.

O valor padrão para o limite de transactionTooLargeForCacheThreshold é 0.75. O servidor retorna TransactionTooLargeForCache em vez de tentar novamente a transação quando a transação usa mais de 75% do cache.

Em versões anteriores do MongoDB, o servidor retorna TemporarilyUnavailable ou WriteConflict em vez de TransactionTooLargeForCache.

Utilize o comando setParameter para modificar o limite de erro.

The following mongosh methods are available for transactions:

Observação

The mongosh example omits retry logic and robust error handling for simplicity's sake. For a more practical example of incorporating transactions in applications, see Transaction Error Handling instead.

// Create collections:
db.getSiblingDB("mydb1").foo.insertOne(
{abc: 0},
{ writeConcern: { w: "majority", wtimeout: 2000 } }
)
db.getSiblingDB("mydb2").bar.insertOne(
{xyz: 0},
{ writeConcern: { w: "majority", wtimeout: 2000 } }
)
// Start a session.
session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
coll1 = session.getDatabase("mydb1").foo;
coll2 = session.getDatabase("mydb2").bar;
// Start a transaction
session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } );
// Operations inside the transaction
try {
coll1.insertOne( { abc: 1 } );
coll2.insertOne( { xyz: 999 } );
} catch (error) {
// Abort transaction on error
session.abortTransaction();
throw error;
}
// Commit the transaction using write concern set at transaction start
session.commitTransaction();
session.endSession();