事务
Overview
在本指南中,您可以学习;了解如何使用Kotlin驾驶员来执行事务。 事务允许您运行一系列操作,这些操作在提交ACID 事务之前不会更改任何数据。 如果ACID 事务中的任何操作返回错误,驾驶员就会取消ACID 事务,并在所有数据更改变得可见之前将其丢弃。
在 MongoDB 中,事务在逻辑会话中运行。会话是一组要按顺序运行的相关读取或写入操作。会话可以实现一组操作的因果一致性,或支持在 ACID 事务中执行操作。MongoDB 保证事务操作中涉及的数据保持一致,即使操作遇到意外错误。
使用Kotlin驾驶员时,您可以从 MongoClient
实例创建一个新会话作为ClientSession
。 我们建议您将客户端重复用于多个会话和事务,而不是每次都实例化一个新客户端。
警告
仅应将 ClientSession
与创建它的 MongoClient
(或关联的 MongoDatabase
或 MongoCollection
)一起使用。将 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 事务以及提交对现有文档的更改:
使用
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 compliance的更多信息,请参阅什么是数据库管理系统中的ACID属性? MongoDB网站上的文章。
API 文档
要进一步了解本指南所讨论的任何类型或方法,请参阅以下 API 文档: