Docs 菜单
Docs 主页
/ / /
Kotlin 协程
/

事务

在此页面上

  • Overview
  • 方法
  • 例子
  • 更多信息
  • API 文档

在本指南中,您可以学习;了解如何使用Kotlin驾驶员来执行事务事务允许您运行一系列操作,这些操作在提交ACID 事务之前不会更改任何数据。 如果ACID 事务中的任何操作返回错误,驾驶员就会取消ACID 事务,并在所有数据更改变得可见之前将其丢弃。

在 MongoDB 中,事务在逻辑会话中运行。会话是一组要按顺序运行的相关读取或写入操作。会话可以实现一组操作的因果一致性,或支持在 ACID 事务中执行操作。MongoDB 保证事务操作中涉及的数据保持一致,即使操作遇到意外错误。

使用Kotlin驾驶员时,您可以从 MongoClient实例创建一个新会话作为ClientSession 。 我们建议您将客户端重复用于多个会话和事务,而不是每次都实例化一个新客户端。

警告

仅应将 ClientSession 与创建它的 MongoClient(或关联的 MongoDatabaseMongoCollection)一起使用。将 ClientSession 与其他 MongoClient 一起使用会导致操作错误。

Client实例上使用startSession()方法创建ClientSession 。 然后,您可以使用以下方法修改会话状态:

方法
说明
startTransaction()
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).
abortTransaction()
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.
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.

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

此示例使用以下Kotlin数据类对其文档进行建模:

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

以下示例演示了如何创建会话、创建ACID 事务以及提交对现有文档的更改:

  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 compliance的更多信息,请参阅什么是数据库管理系统中的ACID属性? MongoDB网站上的文章。

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

后退

索引