Transações
Visão geral
Neste guia, você pode aprender a usar o driver Kotlin Sync 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 escrita relacionadas que você pretende executar sequencialmente. As sessões permitem consistência causal para um grupo de operações e permitem executar 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 Kotlin Sync, você pode criar uma nova sessão a partir de uma instância MongoClient
como tipo ClientSession
. Recomendamos que você reutilize seu MongoClient
para várias sessões e transações, em vez de criar 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 a collection sample_restaurants.restaurants
dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Os documentos nesta coleção são modelados pela seguinte classe de dados Kotlin :
data class Restaurant(val name: String, val cuisine: String)
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 |
---|---|
startTransaction() | Starts a new transaction, configured with the given options, on
this session. Returns an error if there is already
a transaction in progress for the session. To learn more about
this method, see the startTransaction() page in the Server manual. Parameter: TransactionOptions |
abortTransaction() | Ends the active transaction for this session. Returns an
error if there is no active transaction for the session or the
transaction has been committed or ended. To learn more about
this method, see the abortTransaction() page in the Server manual. |
commitTransaction() | 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. To learn more about
this method, see the commitTransaction() page in the Server manual. |
withTransaction() | Starts a transaction on this session and runs the given function within
a transaction. Parameters: transaction body function, TransactionOptions |
Exemplo
O exemplo a seguir demonstra como criar uma sessão, criar uma transação e inserir documentos em uma coleção em uma transação por meio das seguintes etapas:
Crie uma sessão a partir do cliente usando o método
startSession()
.Defina o método
insertRestaurantsInTransaction()
para inserir vários documentos na collectionrestaurants
.Use o método
withTransaction()
para iniciar uma transação. O métodowithTransaction()
executa as operações de inserção e confirma a transação. Se qualquer operação resultar em erros, owithTransaction()
cancelará a transação.Feche a conexão com o servidor usando o método
MongoClient.close()
.
// Creates a new MongoClient to manage your connection val client = MongoClient.create("<connection string>") // Gets the database and collection val database = client.getDatabase("sample_restaurants") val collection = database.getCollection<Restaurant>("restaurants") // Inserts restaurants into the collection fun insertRestaurantsInTransaction(session: ClientSession) { // Inserts restaurants within the transaction collection.insertOne( session, Restaurant("Kotlin Sync Pizza", "Pizza") ) collection.insertOne( session, Restaurant("Kotlin Sync Burger", "Burger") ) } // Starts a client session client.startSession().use { session -> try { // Sets transaction options val txnOptions = TransactionOptions.builder() .readConcern(ReadConcern.LOCAL) .writeConcern(WriteConcern.MAJORITY) .build() // Uses the withTransaction method to start a transaction and run the given function session.withTransaction({ insertRestaurantsInTransaction(session) println("Transaction succeeded") }, txnOptions) } catch (e: Exception) { println("Transaction failed: ${e.message}") } } // Closes the MongoClient client.close()
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.
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: