文档菜单
文档首页
/ / /
C#/.NET
/

事务

在本页

  • 概述
  • 方法
  • 示例
  • 更多信息
  • API 文档

在本指南中,您可以了解如何使用 MongoDB .NET/C# 驱动程序执行 事务事务 允许您运行一系列操作,直到事务提交之前不会更改任何数据。如果事务中的任何操作返回错误,驱动程序将取消事务并丢弃所有数据更改,以确保它们永远不会变得可见。

MongoDB 中,事务在逻辑 会话 中运行。一个 会话 是一系列相关的读或写操作,您打算依次运行。会话使一组操作或允许您执行 ACID 事务 具有因果关系一致性。MongoDB 保证事务操作涉及的数据保持一致性,即使操作遇到意外错误。

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

警告

仅与创建它的 MongoClient(或相关的 MongoDatabaseMongoCollection)一起使用 IClientSession。使用与不同 MongoClient 一起使用的 IClientSession 将导致操作错误。

使用您的 MongoClient 实例上的同步 StartSession() 或异步 StartSessionAsync() 方法创建一个 IClientSession。然后,您可以使用 IClientSession 接口提供的方法修改会话状态。从以下选项中选择同步方法异步方法 选项卡,了解管理事务的方法

方法
描述

StartTransaction()

在此会话上启动一个新的事务,配置了给定的选项。如果会话中已有一个正在进行的交易,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 startTransaction() 页面

参数: TransactionOptions(可选)

AbortTransaction()

结束此会话的当前事务。如果没有会话中正在进行的交易或事务已被提交或结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 abortTransaction() 页面

参数: CancellationToken

CommitTransaction()

提交此会话的当前事务。如果没有会话中正在进行的交易或事务已被结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 commitTransaction() 页面

参数: CancellationToken

WithTransaction()

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

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


参数: Func <IClientSessionHandle, CancellationToken, Task<TResult>>TransactionOptionsCancellationToken
返回类型: Task <TResult>
方法
描述

StartTransaction()

在此会话上启动一个新的事务,配置了给定的选项。如果会话中已有一个正在进行的交易,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 startTransaction() 页面

参数: TransactionOptions(可选)

AbortTransactionAsync()

结束此会话的当前事务。如果没有会话中正在进行的交易或事务已被提交或结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 abortTransaction() 页面

参数: CancellationToken
返回类型: Task

CommitTransactionAsync()

提交此会话的当前事务。如果没有会话中正在进行的交易或事务已被结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 commitTransaction() 页面

参数: CancellationToken
返回类型: Task

WithTransactionAsync()

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

重要:WithTransactionAsync() 使用的回调函数中捕获异常时,你必须在退出 try-catch 块之前重新抛出异常。否则可能导致无限循环。有关如何处理此类异常的详细信息,请参阅服务器手册中的 事务,并在语言下拉菜单中选择 C# 以查看示例。


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

此示例展示了如何通过以下步骤创建会话、创建事务,并在事务中通过多个集合插入文档:

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

  2. 使用 StartTransaction() 方法开始事务。

  3. 将文档插入 booksfilms 集合。

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

var books = database.GetCollection<Book>("books");
var films = database.GetCollection<Film>("films");
// Begins transaction
using (var session = mongoClient.StartSession())
{
session.StartTransaction();
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!");
}
Successfully committed transaction!

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

要了解更多关于本指南中讨论的任何类型或方法的信息,请参阅以下API文档

返回

GUIDs