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.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Menu Docs

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

A Callback API:

A Core API:

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

  • Não incorpora a lógica de tratamento de erros para TransientTransactionError e UnknownTransactionCommitResult e, em vez disso, oferece a flexibilidade de incorporar o tratamento de erros personalizado para esses erros.

A API de retorno de chamada incorpora lógica:

A partir do MongoDB 6.2, o servidor não tenta novamente a transação se receber um erro TransactionTooLargeForCache.

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".

  • A API de transação principal não incorpora lógica de repetição para "TransientTransactionError". Para lidar com "TransientTransactionError", os aplicativos devem incorporar explicitamente a lógica de repetição para o erro. Para ver um exemplo que incorpora a lógica de repetição para erros transitórios, consulte 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".

  • A API de transação principal não incorpora lógica de repetição para "UnknownTransactionCommitResult". Para lidar com "UnknownTransactionCommitResult", os aplicativos devem incorporar explicitamente a lógica de repetição para o erro. Para ver um exemplo que incorpora a lógica de repetição para erros de confirmação desconhecidos, consulte Exemplo Core API.

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.

Os seguintes métodos mongosh estão disponíveis para transações:

Observação

O exemplo mongosh omite a lógica de repetição e o tratamento robusto de erros por uma questão de simplicidade. Para obter um exemplo mais prático da incorporação de transações em aplicativos, consulte Tratamento de erros de transação.

// 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();