Docs 菜单
Docs 主页
/ / /
Rust 驱动程序
/

事务

在此页面上

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

在本指南中,您可以了解如何使用 Rust 驱动程序执行事务。事务允许您执行一系列操作,这些操作仅在整个事务提交后才会更改数据。如果事务中的任何操作不成功,驱动程序就会停止事务,并在所有数据更改变得可见之前予以丢弃。这种特征称为原子性

在 MongoDB 中,事务在逻辑会话中运行。 会话是要按顺序运行的一组相关读取或写入操作。 会话为一组操作启用因果一致性,并允许您在符合 ACID 的事务中运行操作,这是一个满足原子性、一致性、隔离性和持久性预期的事务。 MongoDB 保证事务操作中涉及的数据保持一致,即使操作遇到意外错误。

使用 Rust 驱动程序时,您可以从 Client实例创建一个新会话,并将其类型定义为ClientSession 。 您可以将客户端重复用于多个会话和事务,而不是每次都实例化新客户端,从而提高应用程序的性能。

警告

仅在创建ClientSessionClient上运行的操作中使用 。 将ClientSession与不同的Client一起使用会导致操作错误。

Client实例上使用start_session()方法创建ClientSession 。 然后,您可以使用ClientSession类型提供的方法修改会话状态。 下表描述了这些方法:

方法
说明

start_transaction()

Starts a new transaction on this session. The session must be passed into each operation within the transaction, or the operation will run outside of the transaction.

You can set transaction options by chaining TransactionOptions option builder methods to start_transaction().

Errors returned from operations run within the transaction might include a TRANSIENT_TRANSACTION_ERROR label, which indicates that the entire transaction can be ended, then retried with the expectation that it will succeed.

commit_transaction()

Commits the active transaction for this session. This method returns an error if there is no active transaction for the session or the transaction was previously ended.

This method might return an error that includes an UNKNOWN_TRANSACTION_COMMIT_RESULT label, which indicates that it is unknown if the committed transaction satisfies the set write concern. If you encounter this error, it is safe to retry the commit until the write concern is satisfied or the method returns an error without the label.

abort_transaction()

Ends the active transaction for this session. This method returns an error if there is no active transaction for the session or if the transaction was committed or ended.

and_run()

Runs the given callback, then commits or ends the transaction. The driver retries callbacks and commits that raise an error with a TRANSIENT_TRANSACTION_ERROR label. If they raise any other error, the driver ends the transaction and returns the error to the caller. When you use this method to perform a transaction, the driver automatically handles any errors, so you can choose to omit error handling code.

Because the callback returns a future and can be run multiple times, the Rust language closure borrowing rules for captured values can be restrictive. So, the and_run() method accepts a context parameter that is passed to the callback.

Parameters: context C, callback FnMut(&'a mut ClientSession, &'a mut C)

重要

可在事务中运行的方法

要在事务中运行MongoDB操作,必须将session()方法链接到该操作。 此方法接受ClientSession实例作为参数。

示例,要删除文档,通常可以使用delete_one()方法。 但是,要删除ACID 事务中的文档,您必须将session()方法链接到delete_one()并将会话作为参数传递。

以下代码定义了将数据插入到booksfilmscollection的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(doc! {
"name": "Sula",
"author": "Toni Morrison"
})
.session(&mut *session)
.await?;
films_coll
.insert_one(doc! {
"name": "Nostalgia",
"year": 1983
})
.session(&mut *session)
.await?;
Ok(())
}

以下代码完成以下操作以执行事务:

  1. 使用start_session()方法从客户端创建会话。

  2. 调用start_transaction()方法启动ACID 事务。

  3. 调用and_run()方法以在ACID 事务中运行insert_media()回调函数。

let mut session = client.start_session().await?;
session
.start_transaction()
.and_run((), |session, _| insert_media(session).boxed())
.await?;
println!("Successfully committed transaction!");
Successfully committed transaction!

如果您需要更好地控制事务,请参阅 ClientSession API文档 以查找演示如何手动创建和提交ACID 事务的示例。

注意

不支持并行操作

Rust驾驶员不支持在单个ACID 事务中运行并行操作。

如果您使用的是MongoDB Server v8.0 或更高版本,则可以使用批量写入操作在单个ACID 事务中对多个命名空间执行写入操作。有关更多信息,请参阅 批量操作指南。

要了解有关本指南中提到的概念的更多信息,请参阅服务器手册中的以下页面:

要学习;了解有关ACID compliance的更多信息,请参阅什么是数据库管理系统中的ACID属性? MongoDB网站上的文章。

要了解有关插入操作的更多信息,请参阅插入文档指南。

要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档:

后退

Atlas Search 索引