Transações
Visão geral
Neste guia, você pode aprender como usar o MongoDB Go Driver para executar transações. Astransaçõ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 qualquer 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.
No MongoDB, as transações são executadas dentro de sessões lógicas. Uma sessão é um agrupamento de operações de leitura ou escrita relacionadas que você pretende executar sequencialmente. As sessões permitem consistência causal para um grupo de operações ou permitem que você execute operações em uma transação ACID. O MongoDB garante que os dados envolvidos em suas operações de transação permaneçam consistentes, mesmo que as operações encontrem erros inesperados.
Ao utilizar o driver Go, você pode criar uma nova sessão a partir de uma instância do Client
como um tipo do 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.
Métodos
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() | Inicia uma nova transação, configurada com as opções fornecidas, nesta sessão. Retorna um erro se já houver uma transação em andamento para a sessão. Para saber mais sobre esse método, consulte a página startTransaction() no manual do servidor. Parâmetro: TransactionOptions Tipo de Retorno: error |
AbortTransaction() | Termina a transação ativa para esta sessão. Retorna um erro se não houver uma transação ativa para a sessão ou se a transação tiver sido confirmada ou encerrada. Para saber mais sobre esse método, consulte a página abortTransaction() no manual do servidor. Parâmetro: Context Tipo de Retorno: error |
CommitTransaction() | Confirma a transação ativa para esta sessão. Retorna um erro se não houver nenhuma transação ativa para a sessão ou se a transação tiver sido encerrada. Para saber mais sobre esse método, consulte a página commitTransaction() no manual do servidor. ObservaçãoTentando novamente uma transaçãoO método Uma transação pode ser bem-sucedida, mas devolva um erro com a etiqueta 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 Retorno: 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.
Exemplo
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:
Crie uma sessão a partir do cliente utilizando o método
StartSession()
.Use o método
WithTransaction()
para iniciar uma transação.Insere vários documentos. O método
WithTransaction()
executa a inserção e confirma a transação. Se qualquer operação resultar em erros, oWithTransaction()
lida com o cancelamento da transação.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.
Informações adicionais
Para obter mais informações sobre operações de inserção, consulte a página de fundamentosde 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.
Documentação da API
Para saber mais sobre qualquer um dos tipos ou métodos discutidos neste guia, consulte a seguinte documentação da API: