API de retorno de chamada versus API central
Inicia uma transação, executa as operações especificadas e commits (ou cancela por engano).
Automatically incorporates error handling logic for
TransientTransactionErrorandUnknownTransactionCommitResult.
The Core API:
Requer chamada explícita para iniciar a transação e confirmar a transação.
Does not incorporate error handling logic for
TransientTransactionErrorandUnknownTransactionCommitResult, and instead provides the flexibility to incorporate custom error handling for these errors.
API de retorno de chamada
A API de retorno de chamada incorpora lógica:
To retry the transaction as a whole if the transaction encounters a
TransientTransactionErrorerror.To retry the commit operation if the commit encounters an
UnknownTransactionCommitResulterror.
Starting in MongoDB 6.2, the server does not retry the transaction if it receives a TransactionTooLargeForCache error.
Exemplo
Core API
A API de transação principal não incorpora lógica de repetição para erros rotulados:
TransientTransactionError. If an operation in a transaction returns an error labeledTransientTransactionError, the transaction as a whole can be retried.To handle
TransientTransactionError, applications should explicitly incorporate retry logic for the error.UnknownTransactionCommitResult. If the commit returns an error labeledUnknownTransactionCommitResult, the commit can be retried.To handle
UnknownTransactionCommitResult, applications should explicitly incorporate retry logic for the error.
Exemplo
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 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.
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".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.
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
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();