对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

在C#中使用事务

在本指南中,您可以学习如何使用 MongoDB .NET/C# 驱动程序来执行事务。事务允许您运行一系列操作,这些操作在提交事务之前不会更改任何数据。如果事务中的任何操作返回错误,驱动程序就会取消事务,并在所有数据更改变得可见之前将其丢弃。

在MongoDB中,事务在逻辑会话中运行。会话是您打算按顺序运行的一组相关读取或写入操作。会话启用一群组操作的因果一致性,或者允许您在ACID transaction中执行操作。 MongoDBACID 一致性保证ACID 事务操作中涉及的数据保持一致,即使操作遇到意外错误。

使用 .NET/C# 驱动程序时,可以从 MongoClient 实例创建一个新会话,并将其类型定义为 IClientSession。我们建议您将客户端重复用于多个会话和事务,而不是每次都实例化新客户端。

警告

仅应将 IClientSession 与创建它的 MongoClient(或关联的 MongoDatabase 或 MongoCollection)一起使用。将 IClientSession 与其他 MongoClient 一起使用会导致操作错误。

在 MongoClient 实例上使用同步 StartSession() 或异步 StartSessionAsync() 方法创建 IClientSession。然后,您可以使用 IClientSession 接口提供的方法集来修改会话状态。从以下 Synchronous Methods 和 Asynchronous Methods 标签页中进行选择,了解管理事务的方法:

方法
说明

StartTransaction()

在此会话上启动使用给定选项配置的新ACID 事务。如果会话已存在正在进行的ACID 事务,则会引发异常。要学习;了解有关此方法的更多信息,请参阅服务器手册中的 startTransaction()

页面。参数:TransactionOptions(可选)

AbortTransaction()

结束此会话的ACID 事务。如果会话没有ACID 事务或者ACID 事务已提交或结束,则会引发异常。要学习;了解有关此方法的更多信息,请参阅服务器手册中的 abortTransaction()

页面。参数:CancellationToken

CommitTransaction()

提交此会话的ACID 事务。如果会话没有ACID 事务或ACID 事务已结束,则会引发异常。要学习;了解有关此方法的更多信息,请参阅服务器手册中的 commitTransaction()

页面。参数:CancellationToken

WithTransaction()

在此会话上启动事务并运行给定的回调。要了解有关此方法的更多信息,请参阅服务器手册中的 withTransaction() 页面。

重要提示:在 WithTransaction() 使用的回调函数中捕获异常时,必须在退出 try-catch区块之前重新抛出异常。否则可能会导致无限循环。有关如何处理这种情况下的异常的更多详细信息,请参阅《服务器》手册中的“事务”,并从语言下拉列表中选择 C# 以查看示例。


参数:Func <IClientSessionHandle, CancellationToken, Task<TResult>>、TransactionOptions、CancellationToken
返回类型:Task <TResult>

要配置单个ACID 事务,请将 TransactionOptions实例传递给 StartTransaction() 或 WithTransaction() 方法。本节中的示例将读关注(read concern)设置为 ReadConcern.Majority,写关注(write concern)为 WriteConcern.WMajority。

您可以使用以下属性配置 TransactionOptions对象:

属性
说明

MaxCommitTime

单个 commitTransaction 命令可以运行的最长时间。如果提交超过此限制, MongoDB Server将返回 MaxTimeMSExpired 错误并且不会提交ACID

事务。如果省略此属性, MongoDB Server将应用默认ACID

事务运行时限制。数据类型:TimeSpan?

ReadConcern

读取ACID 事务的关注。要学习;了解更多信息,请参阅MongoDB

Server手册中的读关注。数据类型:ReadConcern

ReadPreference

ACID 事务的读取偏好。要学习;了解更多信息,请参阅MongoDB

Server手册中的读取偏好。数据类型:ReadPreference

WriteConcern

写入ACID 事务的关注。要学习;了解更多信息,请参阅MongoDB

Server手册中的写关注。数据类型:WriteConcern

此示例展示了如何通过以下步骤创建会话、配置ACID 事务选项、创建ACID 事务以及将文档插入到ACID 事务中的多个集合中:

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

  2. 创建 TransactionOptions对象以配置ACID 事务。

  3. 使用 StartTransaction() 方法启动事务。

  4. 将文档插入 books 和 films 集合。

  5. 使用 CommitTransaction() 方法提交事务。

var books = database.GetCollection<Book>("books");
var films = database.GetCollection<Film>("films");
// Begins transaction
using (var session = mongoClient.StartSession())
{
// Configures transaction options
var transactionOptions = new TransactionOptions(
readConcern: ReadConcern.Majority,
writeConcern: WriteConcern.WMajority
);
session.StartTransaction(transactionOptions);
try
{
// Creates sample data
var book = new Book
{
Title = "Beloved",
Author = "Toni Morrison",
InStock = true
};
var film = new Film
{
Title = "Star Wars",
Director = "George Lucas",
InStock = true
};
// Inserts sample data
books.InsertOne(session, book);
films.InsertOne(session, film);
// Commits our transaction
session.CommitTransaction();
}
catch (Exception e)
{
Console.WriteLine("Error writing to MongoDB: " + e.Message);
return;
}
// Prints a success message if no error thrown
Console.WriteLine("Successfully committed transaction!");
}

注意

不支持并行操作

.NET/ C#驱动程序不支持在单个ACID 事务中运行并行操作。

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

要进一步了解本指南所讨论的任何类型或方法,请参阅以下 API 文档: