事务
概述
在本指南中,您可以学习如何使用 Kotlin 驱动程序来执行 事务。事务 允许您运行一系列操作,直到事务提交之前不会更改任何数据。如果事务中的任何操作返回错误,驱动程序将取消事务并丢弃所有更改,以便它们永远不会变得可见。
在 MongoDB 中,事务在逻辑 会话 中运行。一个 会话 是一系列相关的读取或写入操作,您打算按顺序运行这些操作。会话为操作组启用 因果一致性,或允许您执行 ACID 事务。MongoDB 保证您的事务操作涉及的数据保持一致,即使在操作遇到意外错误时也是如此。
使用 Kotlin 驱动程序时,您可以从MongoClient
实例创建一个新的 ClientSession
。我们建议您重复使用客户端进行多个会话和事务,而不是每次都实例化一个新的客户端。
警告
请仅使用与创建它的 MongoClient
(或相关的 MongoDatabase
或 MongoCollection
)一起使用的 ClientSession
。使用不同 MongoClient
的 ClientSession
将导致操作错误。
方法
通过在您的 Client
实例上使用 startSession()
方法来创建一个 ClientSession
。然后,您可以使用以下方法修改会话状态
方法 | 描述 |
---|---|
startTransaction() | 为本次会话启动一个新的事务,使用默认事务选项。如果会话中已存在活动事务,则无法启动新事务。 要设置事务选项,请使用 startTransaction(transactionOptions: TransactionOptions) 。 |
abortTransaction() | 结束本次会话的活动事务。如果会话中没有活动事务或事务已被提前结束,则返回错误。 |
commitTransaction() | 提交本次会话的活动事务。如果会话中没有活动事务或事务已被结束,则返回错误。 |
ClientSession
还具有检索会话属性和修改可变会话属性的方法。查看API 文档了解这些方法的更多信息。
示例
以下示例使用以下 Kotlin 数据类来模拟其文档
data class Account( val accountId: String, val amount: Int )
以下示例演示了如何创建会话、创建事务,并将更改提交到现有文档
使用
startSession()
方法从客户端创建会话。使用
startTransaction()
方法启动事务。更新指定的文档,如果所有操作成功,则使用
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 文档
要了解本指南中讨论的任何类型或方法,请参阅以下API文档