Menu Docs
Página inicial do Docs
/ / /
Driver de fluxos reativos do Java
/

Transações

Nesta página

  • Visão geral
  • Dados de amostra
  • Métodos de transação
  • Exemplo de transação
  • Informações adicionais
  • Documentação da API

Neste guia, você pode aprender como usar o driver Java Reactive Streams para executar transações. As transações permitem que você execute uma série de operações que não se aplicam até que todas as alterações de dados sejam bem-sucedidas. Se qualquer operação da transação falhar, o driver cancelará a transação e descartará todas as alterações de dados sem nunca se tornar visível.

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. Com sessões, você pode habilitar consistência causal para um grupo de operações e executar transações 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 usar o driver Java Reactive Streams, você pode criar uma nova sessão a partir de uma instância MongoClient como tipo ClientSession . 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 ClientSession apenas com o MongoClient (ou MongoDatabase ou MongoCollection associada) que a criou. Utilizar uma ClientSession com um MongoClient diferente resulta em erros de operação.

Os exemplos neste guia usam as collections sample_restaurants.restaurants e sample_mflix.movies dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de amostra, consulte o Introdução.

Importante

Biblioteca do Reator do Projeto

Este guia usa a biblioteca Project Reactor para consumir instâncias do Publisher retornadas pelos métodos de driver Java Reactive Streams. Para saber mais sobre a biblioteca do Project Reactor e como usá-la, consulte Introdução na documentação do Reactor. Para saber mais sobre como usamos os métodos da biblioteca do Project Reactor neste guia, consulte o guia Gravar dados no MongoDB .

Crie um ClientSession utilizando o método startSession() na sua instância do MongoClient . Você pode então modificar o estado da sessão usando os métodos fornecidos por ClientSession. A tabela a seguir detalha os métodos que você pode usar para gerenciar sua transação:

Método
Descrição
startTransaction()
Starts a new transaction, configured with the given options, on this session. Throws an exception if there is already a transaction in progress for the session. To learn more about this method, see the startTransaction() page in the MongoDB Server manual.
abortTransaction()
Ends the active transaction for this session. Throws an exception if there is no active transaction for the session or if the transaction is already committed or ended. To learn more about this method, see the abortTransaction() page in the MongoDB Server manual.
commitTransaction()
Commits the active transaction for this session. Throws an exception 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 MongoDB Server manual.

O exemplo a seguir demonstra como criar uma sessão, criar uma transação e inserir documentos em várias coleções em uma transação. O código executa as seguintes etapas:

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

  2. Inicia uma transação usando o método startTransaction()

  3. Insere documentos nas collections restaurants e movies

  4. Confirma a transação usando o método commitTransaction()

MongoClient mongoClient = MongoClients.create(settings);
MongoDatabase restaurantsDatabase = mongoClient.getDatabase("sample_restaurants");
MongoCollection<Document> restaurants = restaurantsDatabase.getCollection("restaurants");
MongoDatabase moviesDatabase = mongoClient.getDatabase("sample_mflix");
MongoCollection<Document> movies = moviesDatabase.getCollection("movies");
Mono.from(mongoClient.startSession())
.flatMap(session -> {
// Begins the transaction
session.startTransaction();
// Inserts documents in the given order
return Mono.from(restaurants.insertOne(session, new Document("name", "Reactive Streams Pizza").append("cuisine", "Pizza")))
.then(Mono.from(movies.insertOne(session, new Document("title", "Java: Into the Streams").append("type", "Movie"))))
// Commits the transaction
.flatMap(result -> Mono.from(session.commitTransaction())
.thenReturn(result))
.onErrorResume(error -> Mono.from(session.abortTransaction()).then(Mono.error(error)))
.doFinally(signalType -> session.close());
})
// Closes the client after the transaction completes
.doFinally(signalType -> mongoClient.close())
// Prints the results of the transaction
.subscribe(
result -> System.out.println("Transaction succeeded"),
error -> System.err.println("Transaction failed: " + error)
);

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

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

Voltar

Operações de gravação em massa