我正在使用“存储库+工作单元”模式在C#Mongo DB驱动程序的顶部实现DAL抽象层。我当前的设计是每个工作实例实例都将打开(和关闭)新的Mongo DB会话。问题是Mongo DB仅允许会话和事务之间的1:1比率,因此在同一.NET事务下无法进行多个工作单元。
当前的实现是:
public class MongoUnitOfWork
{
private IClientSessionHandle _sessionHandle;
public MongoUnitOfWork(MongoClient mongoClient)
{
_sessionHandle = mongoClient.StartSession();
}
public void Dispose()
{
if (_sessionHandle != null)
{
// Must commit transaction, since the session is closing
if (Transaction.Current != null)
_sessionHandle.CommitTransaction();
_sessionHandle.Dispose();
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,以下代码将不起作用。第一批数据将提前提交:
using (var transactionScope = new TransactionScope())
{
using (var unitOfWork = CreateUnitOfWork())
{
//... insert items
unitOfWork.SaveChanges();
} // Mongo DB unit of work implementation will commit the changes when disposed
// …
Run Code Online (Sandbox Code Playgroud) 我需要使用Mongo DB事务,最近我了解到事务不适用于Mongo独立模式,而仅适用于副本集(带有C#的Mongo DB-与事务无关地添加文档)。
另外,我读到不建议将独立模式用于生产。
因此,我发现只需在mongod.cfg中定义一个副本集名称就足以将Mongo DB作为副本集而不是独立运行。
更改之后,Mongo事务开始工作。
但是,虽然我并没有真正使用复制功能,但将其用作副本集感到有些奇怪,并且我想确保使用的是有效配置。
所以我的问题是: