文档菜单
文档首页
/ / /
Kotlin 协程
/

事务

在本页

  • 概述
  • 方法
  • 示例
  • 附加信息
  • API 文档

在本指南中,您可以学习如何使用 Kotlin 驱动程序来执行 事务事务 允许您运行一系列操作,直到事务提交之前不会更改任何数据。如果事务中的任何操作返回错误,驱动程序将取消事务并丢弃所有更改,以便它们永远不会变得可见。

在 MongoDB 中,事务在逻辑 会话 中运行。一个 会话 是一系列相关的读取或写入操作,您打算按顺序运行这些操作。会话为操作组启用 因果一致性,或允许您执行 ACID 事务。MongoDB 保证您的事务操作涉及的数据保持一致,即使在操作遇到意外错误时也是如此。

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

警告

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

通过在您的 Client 实例上使用 startSession() 方法来创建一个 ClientSession。然后,您可以使用以下方法修改会话状态

方法
描述
startTransaction()
为本次会话启动一个新的事务,使用默认事务选项。如果会话中已存在活动事务,则无法启动新事务。

要设置事务选项,请使用 startTransaction(transactionOptions: TransactionOptions)
abortTransaction()
结束本次会话的活动事务。如果会话中没有活动事务或事务已被提前结束,则返回错误。
commitTransaction()
提交本次会话的活动事务。如果会话中没有活动事务或事务已被结束,则返回错误。

ClientSession 还具有检索会话属性和修改可变会话属性的方法。查看API 文档了解这些方法的更多信息。

以下示例使用以下 Kotlin 数据类来模拟其文档

data class Account(
val accountId: String,
val amount: Int
)

以下示例演示了如何创建会话、创建事务,并将更改提交到现有文档

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

  2. 使用 startTransaction() 方法启动事务。

  3. 更新指定的文档,如果所有操作成功,则使用 commitTransaction() 方法,如果任何操作失败,则使用 abortTransaction() 方法。

// 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()
}

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

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

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

返回

索引