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

Transações

Neste guia, você pode aprender como usar o MongoDB Go Driver para realizar transações. As transações permitem que você execute uma série de operações que não alteram nenhum dado até que a transação seja confirmada. Se alguma operação na transação retornar um erro, o driver cancelará a transação e descartará todas as alterações de dados antes que elas se tornem visíveis.

In MongoDB, transactions run within logical sessions. A session is a grouping of related read or write operations that you intend to run sequentially. Sessions enable causal consistency for a group of operations or allow you to execute operations in an ACID transaction. MongoDB guarantees that the data involved in your transaction operations remains consistent, even if the operations encounter unexpected errors.

Ao usar o driver Go, você pode criar uma nova sessão a partir de uma instância Client como tipo Session . Recomendamos que você reutilize seu cliente para várias sessões e transações, em vez de fazer a instância de um novo cliente a cada vez.

Aviso

Utilize uma Session apenas com o Client (ou Database ou Collection associada) que a criou. Utilizar uma Session com um Client diferente resulta em erros de operação.

Aviso

Implementações do Session não são seguras para uso concorrente por múltiplos goroutines.

Após iniciar uma sessão utilizando o método StartSession(), você pode modificar o estado da sessão utilizando o conjunto de métodos fornecido pela interface da Session. A tabela a seguir descreve esses métodos:

Método
Descrição

StartTransaction()

Starts a new transaction, configured with the given options, on this session. Returns an error if there is already a transaction in progress for the session. To learn more about this method, see the startTransaction() page in the Server manual.

Parameter: TransactionOptions
Return Type: error

AbortTransaction()

Ends the active transaction for this session. Returns an error if there is no active transaction for the session or the transaction has been committed or ended. To learn more about this method, see the abortTransaction() page in the Server manual.

Parameter: Context
Return Type: error

CommitTransaction()

Commits the active transaction for this session. Returns an error if there is no active transaction for the session or if the transaction was ended. To learn more about this method, see the commitTransaction() page in the Server manual.

The CommitTransaction() method is an idempotent function, which means that you can attempt to commit a transaction multiple times without changing data after the first successful commit. A transaction can succeed but return an error with the UnknownTransactionCommitResult label. If you rerun the CommitTransaction() method after receiving this error, your data is not changed by the repeat attempts.


Parâmetro: Context
Tipo de retorno: error

WithTransaction()

Inicia uma transação nesta sessão e executa a chamada de resposta fn.

Parâmetros: Context, fn func(ctx SessionContext), TransactionOptions
Tipo de dados: interface{}, error

EndSession()

Encerra quaisquer transações existentes e fecha a sessão.

Parâmetro: Context
Tipo de devolução: nenhum

A interface do Session também tem métodos para recuperar propriedades da sessão e modificar propriedades da sessão mutáveis. Encontre mais informações na documentação da API.

Observação

Operações paralelas não suportadas

O driver Go não suporta a execução de operações paralelas dentro de uma única transação.

O exemplo a seguir mostra como você pode criar uma sessão, criar uma transação e confirmar uma operação de inserção de vários documentos por meio das seguintes etapas:

  1. Crie uma sessão a partir do cliente utilizando o método StartSession().

  2. Use o método WithTransaction() para iniciar uma transação.

  3. Insere vários documentos. O método WithTransaction() executa a inserção e confirma a transação. Se qualquer operação resultar em erros, o WithTransaction() lida com o cancelamento da transação.

  4. Feche a transação e a sessão usando o método EndSession().

wc := writeconcern.Majority()
txnOptions := options.Transaction().SetWriteConcern(wc)
// Starts a session on the client
session, err := client.StartSession()
if err != nil {
panic(err)
}
// Defers ending the session after the transaction is committed or ended
defer session.EndSession(context.TODO())
// Inserts multiple documents into a collection within a transaction,
// then commits or ends the transaction
result, err := session.WithTransaction(context.TODO(), func(ctx mongo.SessionContext) (interface{}, error) {
result, err := coll.InsertMany(ctx, []interface{}{
bson.D{{"title", "The Bluest Eye"}, {"author", "Toni Morrison"}},
bson.D{{"title", "Sula"}, {"author", "Toni Morrison"}},
bson.D{{"title", "Song of Solomon"}, {"author", "Toni Morrison"}},
})
return result, err
}, txnOptions)

Se você precisar de mais controle sobre suas transações, poderá encontrar um exemplo mostrando como criar, confirmar e encerrar transações manualmente no exemplo de código completo.

Para obter mais informações sobre operações de inserção, consulte a página de fundamentos de Inserir um Documento.

Para obter mais informações sobre a especificação de write concerns no driver Go, consulte write concern.

Para obter um exemplo adicional usando sessões e transações com o driver Go, consulte a postagem do blog do desenvolvedor sobre Transações ACID de vários documentos.

Para saber mais sobre qualquer um dos tipos ou métodos discutidos neste guia, consulte a seguinte documentação da API: