事务
概述
在本指南中,您可以了解如何使用 MongoDB .NET/C# 驱动程序执行 事务。事务 允许您运行一系列操作,直到事务提交之前不会更改任何数据。如果事务中的任何操作返回错误,驱动程序将取消事务并丢弃所有数据更改,以确保它们永远不会变得可见。
MongoDB 中,事务在逻辑 会话 中运行。一个 会话 是一系列相关的读或写操作,您打算依次运行。会话使一组操作或允许您执行 ACID 事务 具有因果关系一致性。MongoDB 保证事务操作涉及的数据保持一致性,即使操作遇到意外错误。
使用 .NET/C# 驱动程序时,您可以从MongoClient
实例创建一个新的会话,作为 IClientSession
类型。我们建议您重复使用客户端进行多个会话和事务,而不是每次都实例化新的客户端。
警告
仅与创建它的 MongoClient
(或相关的 MongoDatabase
或 MongoCollection
)一起使用 IClientSession
。使用与不同 MongoClient
一起使用的 IClientSession
将导致操作错误。
方法
使用您的 MongoClient
实例上的同步 StartSession()
或异步 StartSessionAsync()
方法创建一个 IClientSession
。然后,您可以使用 IClientSession
接口提供的方法修改会话状态。从以下选项中选择同步方法 和 异步方法 选项卡,了解管理事务的方法
方法 | 描述 |
---|---|
| 在此会话上启动一个新的事务,配置了给定的选项。如果会话中已有一个正在进行的交易,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 startTransaction() 页面。 参数: TransactionOptions (可选) |
| 结束此会话的当前事务。如果没有会话中正在进行的交易或事务已被提交或结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 abortTransaction() 页面。 参数: CancellationToken |
| 提交此会话的当前事务。如果没有会话中正在进行的交易或事务已被结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 commitTransaction() 页面。 参数: CancellationToken |
| 在此会话上启动事务并运行给定的回调。有关此方法的更多信息,请参阅服务器手册中的 withTransaction() 页面。 重要:在 参数: Func <IClientSessionHandle, CancellationToken, Task<TResult>> ,TransactionOptions ,CancellationToken 返回类型: Task <TResult> |
方法 | 描述 |
---|---|
| 在此会话上启动一个新的事务,配置了给定的选项。如果会话中已有一个正在进行的交易,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 startTransaction() 页面。 参数: TransactionOptions (可选) |
| 结束此会话的当前事务。如果没有会话中正在进行的交易或事务已被提交或结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 abortTransaction() 页面。 参数: CancellationToken 返回类型: Task |
| 提交此会话的当前事务。如果没有会话中正在进行的交易或事务已被结束,则抛出异常。有关此方法的更多信息,请参阅服务器手册中的 commitTransaction() 页面。 参数: CancellationToken 返回类型: Task |
| 在此会话上启动事务并运行给定的回调。有关此方法的更多信息,请参阅服务器手册中的 withTransaction() 页面。 重要:在 参数: Func <IClientSessionHandle, CancellationToken, Task<TResult>> ,TransactionOptions ,CancellationToken 返回类型: Task <TResult> |
示例
此示例展示了如何通过以下步骤创建会话、创建事务,并在事务中通过多个集合插入文档:
使用
StartSession()
方法从客户端创建会话。使用
StartTransaction()
方法开始事务。将文档插入
books
和films
集合。使用
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 文档
要了解更多关于本指南中讨论的任何类型或方法的信息,请参阅以下API文档