Transações
Nesta página
Visão geral
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.
Dados de amostra
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 .
Métodos de transação
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. |
Exemplo de transação
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:
Cria uma sessão a partir do cliente utilizando o método
startSession()
Inicia uma transação usando o método
startTransaction()
Insere documentos nas collections
restaurants
emovies
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) );
Informações adicionais
Para saber mais sobre os conceitos mencionados neste guia, consulte as seguintes páginas no manual do servidor:
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: