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

API de drivers

Nesta página

  • API de retorno de chamada versus API central
  • API de retorno de chamada
  • Núcleo API
  • Versões do driver
  • Tratamento de erros de transação
  • Informações adicionais

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.


➤ Use o menu suspenso Selecione a linguagem no canto superior direito para definir a linguagem dos exemplos nesta página.


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


➤ Use o menu suspenso Selecione a linguagem no canto superior direito para definir a linguagem dos exemplos nesta página.


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 as etapas principais são interrompidas, a transação como um todo pode 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();
← Transações