Visão geral
Neste guia, você pode aprender como usar o driver Java 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 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.
Ao utilizar o driver Java , você pode criar uma nova sessão a partir de uma instância do MongoClient
como um tipo do 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.
Importante
Você deve incluir session
como parâmetro para quaisquer operações que queira incluir em uma transação.
Consistência causal
O MongoDB permite consistência causal em determinadas sessões de cliente. O modelo de consistência causal garante que, em um sistema distribuído, as operações dentro de uma sessão sejam executadas em uma ordem causal. Os clientes observam resultados consistentes com as relações causais ou as dependências entre as operações. Por exemplo, se você executar uma série de operações em que uma operação depende logicamente do resultado de outra, todas as leituras subsequentes refletirão o relacionamento de dependência .
Para garantir a consistência causal, as sessões de cliente devem atender aos seguintes requisitos:
Ao iniciar uma sessão, o driver deve habilitar a opção de consistência causal. Esta opção está habilitada por padrão.
As operações devem ser executadas em uma única sessão em um único thread. Caso contrário, as sessões ou threads devem comunicar os valores de optime e tempo de cluster uns aos outros. Para exibir um exemplo de duas sessões que comunicam esses valores, consulte os exemplos de Consistência causal no manual do MongoDB Server.
Você deve usar uma preocupação de leitura
MAJORITY
.Você deve usar uma preocupação de gravação
MAJORITY
. Este é o valor padrão de preocupação de gravação .
A tabela a seguir descreve as garantias que as sessões causalmente consistentes oferecem:
Garantia | Descrição |
---|---|
Ler suas gravações | As operações de leitura refletem os resultados das operações de gravação anteriores. |
Leituras monotônicas | As operações de leitura não retornam resultados que reflitam um estado de dados anterior a uma operação de leitura anterior. |
Escritas monotônicas | Se uma operação de gravação precisar preceder outras operações de gravação, o servidor executará essa operação de gravação primeiro. Por exemplo, se você chamar |
Escritas que seguem as leituras | Se uma operação de gravação precisar seguir outras operações de leitura, o servidor executará primeiro as operações de leitura. Por exemplo, se você chamar |
Dica
Para saber mais sobre os conceitos mencionados nesta seção, consulte as seguintes entradas de manual do MongoDB Server :
Métodos
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 descreve os métodos que você pode usar para gerenciar sua transação:
Método | Descrição |
---|---|
| Starts a new transaction for this session with the
default transaction options. Pass an instance of TransactionOptions
as a parameter to start a transaction with given options. You
cannot start a transaction if there's already an active transaction
running in the session.Parameter: TransactionOptions transactionOptions |
| Ends the active transaction for this session. Returns an error
if there is no active transaction for the
session or the transaction was previously ended. |
| 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. |
| Starts a new transaction for this session and runs the given function. This
method handles retries, committing, and aborting transactions. Pass an
instance of TransactionBody as a parameter that defines the
operations you want to execute within the transaction.Parameter: TransactionBody<T> transactionBody |
Um ClientSession
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.
Dica
Tempo limite da transação
Você pode definir um limite de tempo para que as operações sejam concluídas em suas transações. Para saber mais, consulte a seção Transações do guia Limitar o tempo de execução do servidor.
Exemplo
O exemplo a seguir demonstra 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 usando o método
startSession()
.Defina as opções de transação para configurar o comportamento da transação.
Use o método
withTransaction()
para iniciar uma transação.Insere vários documentos. O método
withTransaction()
executa, confirma e aborta a transação. Se qualquer operação resultar em erros, owithTransaction()
lida com o cancelamento da transação.
String connectionString = "<connection string>"; // Replace with your connection string try (MongoClient mongoClient = MongoClients.create(connectionString)) { MongoDatabase database = mongoClient.getDatabase("transaction_db"); MongoCollection<Document> collection = database.getCollection("books"); // Sets transaction options TransactionOptions transactionOptions = TransactionOptions.builder() .writeConcern(WriteConcern.MAJORITY) .build(); try (ClientSession session = mongoClient.startSession()) { // Uses withTransaction and lambda for transaction operations session.withTransaction(() -> { collection.insertMany(session, Arrays.asList( new Document("title", "The Bluest Eye").append("author", "Toni Morrison"), new Document("title", "Sula").append("author", "Toni Morrison"), new Document("title", "Song of Solomon").append("author", "Toni Morrison") )); return null; // Return value as expected by the lambda }, transactionOptions); } } catch (Exception e) { e.printStackTrace(); }
Se você precisar de mais controle sobre suas transações, poderá usar o método startTransaction()
. Você pode usar esse método com os métodos commitTransaction()
e abortTransaction()
descritos na seção anterior para gerenciar manualmente o ciclo de vida da transação.
Observação
Operações paralelas não suportadas
O driver Java não suporta a execução de operações paralelas em uma única transação.
Informações adicionais
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 .
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: