Overview
在本指南中,您可以了解如何使用 Rust 驱动程序执行事务。事务允许您执行一系列操作,这些操作仅在整个事务提交后才会更改数据。如果事务中的任何操作不成功,驱动程序就会停止事务,并在所有数据更改变得可见之前予以丢弃。这种特征称为原子性。
在 MongoDB 中,事务在逻辑会话中运行。 会话是要按顺序运行的一组相关读取或写入操作。 会话为一组操作启用因果一致性,并允许您在符合 ACID 的事务中运行操作,这是一个满足原子性、一致性、隔离性和持久性预期的事务。 MongoDB 保证事务操作中涉及的数据保持一致,即使操作遇到意外错误。
使用 Rust 驱动程序时,您可以从Client实例创建一个新会话,并将其类型定义为ClientSession 。 您可以将客户端重复用于多个会话和事务,而不是每次都实例化新客户端,从而提高应用程序的性能。
警告
仅在创建ClientSession的Client上运行的操作中使用 。 将ClientSession与不同的Client一起使用会导致操作错误。
方法
在Client实例上使用start_session()方法创建ClientSession 。 然后,您可以使用ClientSession类型提供的方法修改会话状态。 下表描述了这些方法:
方法 | 说明 |
|---|---|
| Starts a new transaction, configured according to an optional |
| 提交此会话的ACID 事务。如果该会话没有活动ACID 事务或ACID 事务先前已结束,则此方法会返回错误。此方法可能会返回包含 |
| 结束此会话的活动事务。 如果该会话没有活动事务或者事务已提交或结束,则此方法将返回错误。 |
| Starts a transaction on this session and runs the given callback, then commits or ends the transaction. When you use this method to perform a transaction, the driver automatically handles any errors, so you can choose to omit error handling code. |
重要
可在事务中运行的方法
要在事务中运行 MongoDB 任务,必须使用带有 _with_session() 后缀的方法。这些方法接受 ClientSession 实例作为参数。
例如,要删除文档,通常可以使用delete_one()方法。 但是,要在事务中删除文档,您必须使用delete_one_with_session()方法并将会话作为参数传递。
例子
以下代码定义了将数据插入到books和filmscollection的insert_media()回调:
async fn insert_media(session: &mut ClientSession) -> Result<(), Error> { let books_coll = session .client() .database("db") .collection::<Document>("books"); let films_coll = session .client() .database("db") .collection::<Document>("films"); books_coll.insert_one_with_session( doc! { "name": "Sula", "author": "Toni Morrison" }, None, session ).await?; films_coll.insert_one_with_session( doc! { "name": "Nostalgia", "year": 1983 }, None, session ).await?; Ok(()) }
以下代码完成以下操作以执行事务:
使用
start_session()方法从客户端创建会话。使用
with_transaction()方法启动事务,并在事务中运行insert_media()回调函数。
let mut session = client.start_session(None).await?; session .with_transaction((), |session, _| insert_media(session).boxed(), None) .await?; println!("Successfully committed transaction!");
Successfully committed transaction!
如果您需要对事务进行更多控制,请参阅 ClientSession API文档 以查找示例如何手动创建和提交ACID 事务的示例。
更多信息
要了解有关本指南中提到的概念的更多信息,请参阅服务器手册中的以下页面:
要学习;了解有关ACID compliance的更多信息,请参阅什么是数据库管理系统中的ACID属性? MongoDB网站上的文章。
要了解有关插入操作的更多信息,请参阅插入文档指南。
API 文档
要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档: