API de drivers
Nesta página
API de retorno de chamada versus API central
Inicia uma transação, executa as operações especificadas e commits (ou cancela por engano).
Incorpora automaticamente a lógica de tratamento de erros para
TransientTransactionError
eUnknownTransactionCommitResult
.
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
eUnknownTransactionCommitResult
e, em vez disso, oferece a flexibilidade de incorporar o tratamento de erros personalizado para esses erros.
API de retorno de chamada
A API de retorno de chamada incorpora lógica:
Para repetir a transação como um todo se a transação encontrar um erro
TransientTransactionError
.Para tentar novamente a operação de confirmação se a confirmação encontrar um erro
UnknownTransactionCommitResult
.
A partir do MongoDB 6.2, o servidor não tenta novamente a transação se receber um erro TransactionTooLargeForCache
.
Exemplo
➤ Use o menu suspenso Selecione a linguagem no canto superior direito para definir a linguagem dos exemplos nesta página.
Núcleo API
A API de transação principal não incorpora lógica de repetição para erros rotulados:
TransientTransactionError
. Se uma operação em uma transação retornar um erro rotulado comoTransientTransactionError
, a transação como um todo poderá ser repetida.Para lidar com
TransientTransactionError
, os aplicativos devem incorporar explicitamente a lógica de repetição para o erro.UnknownTransactionCommitResult
. Se a confirmação retornar um erro denominadoUnknownTransactionCommitResult
, a confirmação poderá ser repetida.Para lidar com
UnknownTransactionCommitResult
, os aplicativos devem incorporar explicitamente a lógica de repetição para o erro.
Exemplo
➤ 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:
Versões do driver
Tratamento de erros de transação
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.
TransientTransactionError
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.
UnknownTransactionCommitResult
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.
TransactionTooLargeForCache
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.
Informações adicionais
mongosh
Exemplo
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();