Transações
Nesta página
Visão geral
Neste guia, você pode aprender a usar o Driver MongoDB Go para executar 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 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 gravação 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 de sessão
Depois de iniciar uma sessão usando o método StartSession()
em seu cliente, você pode modificar o estado da sessão usando o conjunto de métodos fornecido pelo Session
retornado. A tabela a seguir descreve esses métodos:
Método | Descrição |
---|---|
| 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 |
| 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 |
| 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.Parameter: Context Return Type: error |
| Starts a transaction on this session and runs the fn
callback.Parameters: Context , fn func(ctx SessionContext) , TransactionOptions Return Type: interface{} , error |
| Ends any existing transactions and closes the session. Parameter: Context Return Type: none |
Um Session
também tem métodos para recuperar propriedades da sessão e modificar propriedades da sessão mutáveis. Consulte a documentação da API para saber mais sobre esses métodos.
Opções de sessão e transação
Você pode definir opções no nível da sessão e no nível da transação para personalizar como o driver executa uma transação. As etapas a seguir descrevem como definir opções para todas as transações executadas dentro de um determinado Session
:
Crie uma instância
TransactionOptions
. É possível especificar opções como preocupação de gravação, preocupação de leitura e preferência de leitura para todas as transações executadas em uma determinada sessão.Crie uma instância
SessionOptions
chamando o métodoSetDefaultTransactionOptions()
, passando a instânciaTransactionOptions
como parâmetro.Você também pode especificar outras opções de sessão, como consistência causal na sua instância do
SessionOptions
.Passe a instância
SessionOptions
para o métodoclient.StartSession()
.
O código a seguir especifica opções de sessão e transação e, em seguida, cria uma sessão com essas opções:
txnOpts := options.Transaction().SetReadConcern(readconcern.Majority()) sessOpts := options.Session().SetDefaultTransactionOptions(txnOpts) session, err := client.StartSession(sessOpts) if err != nil { return err }
Observação
Operações paralelas não suportadas
O driver Go não suporta a execução de operações paralelas em uma única transação.
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 context.Context) (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 fundamentos deInserir 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: