Transações
Visão geral
Neste guia, você pode aprender como usar o driver Kotlin 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 usar o driver Kotlin , você pode criar uma nova sessão a partir de uma instância MongoClient
como 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.
Métodos
Crie um ClientSession
utilizando o método startSession()
na sua instância do Client
. Você pode então modificar o estado da sessão usando os seguintes métodos:
Método | Descrição |
---|---|
| Starts a new transaction for this session with the
default transaction options. You cannot start a
transaction if there's already an active transaction
on the session. To set transaction options, use startTransaction(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. |
Um ClientSession
também tem métodos para recuperar propriedades da sessão e modificar propriedades da sessão mutáveis. Ver a documentação da API para saber mais sobre esses métodos.
Exemplo
Este exemplo utiliza a seguinte classe de dados Kotlin para modelar seus documentos:
data class Account( val accountId: String, val amount: Int )
O exemplo a seguir demonstra como criar uma sessão, criar uma transação e confirmar alterações em documentos existentes:
Crie uma sessão a partir do cliente utilizando o método
startSession()
.Use o método
startTransaction()
para iniciar uma transação.Atualize os documentos especificados e, em seguida, use o método
commitTransaction()
se todas as operações forem bem-sucedidas ouabortTransaction()
se alguma operação falhar.
// Set up the session val session = client.startSession() try { session.startTransaction() val savingsColl = database .getCollection<Account>("savings_accounts") val checkingColl = database .getCollection<Account>("checking_accounts") savingsColl.findOneAndUpdate( session, eq(Account::accountId.name, "9876"), inc(Account::amount.name, -100), ) checkingColl.findOneAndUpdate( session, eq(Account::accountId.name, "9876"), inc(Account::amount.name, 100) ) // Commit the transaction val result = session.commitTransaction() println("Transaction committed.") } catch (error: Exception) { println("An error occurred during the transaction: ${error.message}") // Abort the transaction session.abortTransaction() }
Observação
Operações paralelas não suportadas
O driver Kotlin 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: