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 a usar o driver Rust para executar transações. As transações permitem que você execute uma série de operações que alteram os dados somente se toda a transação for confirmada. Se qualquer operação na transação não for bem-sucedida, o driver interrompe a transação e descarta todas as alterações de dados antes que elas se tornem visíveis. Esse recurso é chamado de atomicidade.

No MongoDB, a transação é executada dentro de sessões lógicas. Uma sessão é um agrupamento de operações de leitura ou escrita relacionadas que você deseja executar sequencialmente. As sessões habilitam a consistência causal para um grupo de operações e permitem que você execute operações em uma transação compatível com ACID , que é uma transação que atende a uma expectativa de atomicidade, consistência, isolamento e durabilidade. 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 usar o driver Rust, você pode criar uma nova sessão a partir de uma instância Client como tipo ClientSession . Você pode melhorar o desempenho do seu aplicativo reutilizando seu cliente para várias sessões e transação, em vez de fazer a instância de um novo cliente a cada vez.

Aviso

Use um ClientSession somente em operações executadas no Client que o criou. Utilizar uma ClientSession com um Client diferente resulta em erros de operação.

Crie um ClientSession usando o método start_session() na sua instância Client . Você pode então modificar o estado da sessão utilizando os métodos fornecidos pelo tipo ClientSession . A tabela a seguir descreve esses métodos:

Método
Descrição

start_transaction()

Inicia uma nova transação, configurada de acordo com um parâmetro TransactionOptions opcional, nesta sessão. A sessão deve ser passada para cada operação dentro da transação, ou a operação será executada fora da transação.

Os erros retornados das operações executadas dentro da transação podem incluir um rótulo TRANSIENT_TRANSACTION_ERROR, que indica que toda a transação pode ser encerrada e, em seguida, repetida com a expectativa de que seja bem-sucedida.

Parâmetro: TransactionOptions

commit_transaction()

Confirma a transação ativa para esta sessão. Este método retorna um erro se não houver transação ativa para a sessão ou se a transação tiver sido encerrada anteriormente.

Este método pode retornar um erro que inclui um rótulo UNKNOWN_TRANSACTION_COMMIT_RESULT, o que indica que não se sabe se a transação confirmada satisfaz o write concern definido. Se você encontrar esse erro, é seguro tentar novamente a confirmação até que o write concern seja satisfeito ou o método retorne um erro sem o rótulo.

abort_transaction()

Termina a transação ativa para esta sessão. Esse método 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.

with_transaction()

Inicia uma transação nesta sessão e executa a chamada de resposta fornecida, em seguida, confirma ou encerra a transação. Quando você usa esse método para realizar uma transação, o driver lida automaticamente com quaisquer erros, para que você possa optar por omitir o código de tratamento de erros.

Como a chamada de resposta retorna um futuro e pode ser executada várias vezes, as regras de empréstimo de fechamento da linguagem Rust para valores capturados podem ser restritivas. Portanto, o método with_transaction() aceita um parâmetro de contexto que é passado para a chamada de resposta.

Parâmetros: contexto C, chamada de resposta FnMut(&'a mut ClientSession, &'a mut C), TransactionOptions

Importante

Métodos que podem ser executados em transação

Para executar tarefas do MongoDB em transações, você deve usar os métodos com sufixo _with_session(). Esses métodos aceitam uma instância ClientSession como parâmetro.

Por exemplo, para excluir um documento, geralmente você pode usar o método delete_one() . No entanto, para excluir um documento dentro de uma transação, você deve utilizar o método delete_one_with_session() e passar a sessão como um parâmetro.

O seguinte código define a chamada de resposta insert_media() que insere dados na collection books e na collection films :

async fn insert_media(session: &mut ClientSession) -> Result<(), Error> {
let books_coll = session
.client()
.database("db")
.collection::<Document>("books");
let films_coll = session
.client()
.database("db")
.collection::<Document>("films");
books_coll.insert_one_with_session(
doc! {
"name": "Sula",
"author": "Toni Morrison"
},
None,
session
).await?;
films_coll.insert_one_with_session(
doc! { "name": "Nostalgia", "year": 1983 },
None,
session
).await?;
Ok(())
}

O código a seguir conclui as seguintes ações para executar a transação:

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

  2. Usa o método with_transaction() para iniciar uma transação e executar a função de retorno de chamada insert_media() dentro da transação.

let mut session = client.start_session(None).await?;
session
.with_transaction((), |session, _| insert_media(session).boxed(), None)
.await?;
println!("Successfully committed transaction!");
Successfully committed transaction!

Se você precisar de mais controle sobre suas transações, consulte a documentação da API ClientSession para encontrar um exemplo que mostra como criar e confirmar manualmente uma transação.

Para saber mais sobre os conceitos mencionados neste guia, consulte as seguintes páginas no manual do servidor:

Para saber mais sobre a ACID compliance, consulte Quais são as propriedades ACID nos sistemas de gerenciamento de banco de dados? artigo no site do MongoDB .

Para saber mais sobre operações de inserção, consulte o guia Inserir documento .

Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo: