Menu Docs
Página inicial do Docs
/ / /
Driver de sincronização Kotlin
/

Transações

Nesta página

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

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.

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)

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

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:

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

  2. Defina o método insertRestaurantsInTransaction() para inserir vários documentos na collection restaurants .

  3. Use o método withTransaction() para iniciar uma transação. O método withTransaction() executa as operações de inserção e confirma a transação. Se qualquer operação resultar em erros, o withTransaction() cancelará a transação.

  4. 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.

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

Para saber mais sobre a conformidade com ACID, consulte Quais são as propriedades ACID nos sistemas de gerenciamento de banco de dados? artigo no site do MongoDB.

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