文档菜单
文档首页
/ / /
Kotlin 同步驱动器
/

事务

本页内容

  • 概述
  • 示例数据
  • 方法
  • 示例
  • 更多信息
  • API 文档

在本指南中,您可以了解如何使用 Kotlin Sync 驱动程序执行 事务。事务允许您运行一系列操作,直到事务提交前,这些操作不会更改任何数据。如果事务中的任何操作返回错误,驱动程序将取消事务并丢弃所有数据更改,以避免它们在任何时候变得可见。

在 MongoDB 中,事务在逻辑 会话 中运行。会话是一组相关读或写操作,您打算按顺序运行这些操作。会话为操作组启用 因果一致性,并允许您运行符合 ACID 兼容性的事务,即满足原子性、一致性、隔离性和持久性期望的事务。MongoDB 保证您事务操作涉及的数据保持一致性,即使在操作遇到意外错误时也是如此。

使用 Kotlin Sync 驱动程序时,您可以从MongoClient 实例创建一个新会话,作为 ClientSession 类型。我们建议您重用您的 MongoClient 来进行多个会话和事务,而不是每次都创建一个新的客户端。

警告

仅使用创建它的 MongoClient(或相关的 MongoDatabaseMongoCollection)与 ClientSession。使用不同 MongoClientClientSession 将导致操作错误。

本指南中的示例使用来自Atlas 示例数据集sample_restaurants.restaurants 集合。有关创建免费 MongoDB Atlas 集群并加载示例数据集的说明,请参阅 Atlas 入门 指南。

本集合中的文档由以下 Kotlin 数据类建模

data class Restaurant(val name: String, val cuisine: String)

通过在你的 MongoClient 实例上使用 startSession() 方法创建一个 ClientSession。然后,你可以使用 ClientSession 提供的方法修改会话状态。以下表格描述了你可以用来管理事务的方法

方法
描述
startTransaction()
在当前会话上启动一个新的事务,配置给定的选项。如果会话中已有一个正在进行的交易,则返回错误。有关此方法的更多信息,请参阅服务器手册中的 startTransaction() 页面

参数: TransactionOptions
abortTransaction()
结束此会话的当前事务。如果没有活动事务或事务已提交或结束,则返回错误。有关此方法的更多信息,请参阅服务器手册中的 abortTransaction() 页面

commitTransaction()
提交此会话的当前事务。如果没有活动事务或事务已结束,则返回错误。有关此方法的更多信息,请参阅服务器手册中的 commitTransaction() 页面
withTransaction()
在当前会话上启动一个事务,并在事务中运行给定的函数。

参数: 事务主体函数,TransactionOptions

以下示例演示了如何通过以下步骤创建会话、创建事务,并通过一个事务将文档插入到集合中

  1. 通过使用startSession()方法从客户端创建一个会话。

  2. 定义insertRestaurantsInTransaction()方法,以将多个文档插入到restaurants集合中。

  3. 使用withTransaction()方法启动一个事务。该方法执行插入操作并提交事务。如果任何操作导致错误,withTransaction()将取消事务。

  4. 通过使用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()

如果您需要更精确地控制事务,可以使用startTransaction()方法。您可以结合使用前述部分中描述的commitTransaction()abortTransaction()方法来手动管理事务的生命周期。

要了解更多关于本指南中提到的概念,请参阅服务器手册中的以下页面

要了解更多关于ACID兼容性的信息,请参阅MongoDB网站上什么是数据库管理系统中的ACID属性?文章。

要了解更多关于本指南中讨论的任何类型或方法,请参阅以下API文档

后退

批量写入