事务
概述
在本指南中,您可以了解如何使用 Kotlin Sync 驱动程序执行 事务。事务允许您运行一系列操作,直到事务提交前,这些操作不会更改任何数据。如果事务中的任何操作返回错误,驱动程序将取消事务并丢弃所有数据更改,以避免它们在任何时候变得可见。
在 MongoDB 中,事务在逻辑 会话 中运行。会话是一组相关读或写操作,您打算按顺序运行这些操作。会话为操作组启用 因果一致性,并允许您运行符合 ACID 兼容性的事务,即满足原子性、一致性、隔离性和持久性期望的事务。MongoDB 保证您事务操作涉及的数据保持一致性,即使在操作遇到意外错误时也是如此。
使用 Kotlin Sync 驱动程序时,您可以从MongoClient
实例创建一个新会话,作为 ClientSession
类型。我们建议您重用您的 MongoClient
来进行多个会话和事务,而不是每次都创建一个新的客户端。
警告
仅使用创建它的 MongoClient
(或相关的 MongoDatabase
或 MongoCollection
)与 ClientSession
。使用不同 MongoClient
的 ClientSession
将导致操作错误。
示例数据
本指南中的示例使用来自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 |
示例
以下示例演示了如何通过以下步骤创建会话、创建事务,并通过一个事务将文档插入到集合中
通过使用
startSession()
方法从客户端创建一个会话。定义
insertRestaurantsInTransaction()
方法,以将多个文档插入到restaurants
集合中。使用
withTransaction()
方法启动一个事务。该方法执行插入操作并提交事务。如果任何操作导致错误,withTransaction()
将取消事务。通过使用
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文档
要了解更多关于本指南中讨论的任何类型或方法,请参阅以下API文档