System.NotSupportedException 和 MongoDb C# 事务

System.NotSupportedException with MongoDb C# Transactions

我正在尝试将数据从一个集合移动到另一个集合。因此,我将 RequestProcess 对象添加到 completedRequestsCollection 并将其从 ongoingRequestsCollection 中删除。使用事务来执行此操作是有意义的,以便在任一操作出现问题时可以回滚。

我找到了这个 Mongo Db How-to Guide 并尝试遵循它,请参见下面的代码:

//connect to db and get collections
var mongoClient = new MongoClient(connectionString);
var mongoDb = mongoClient.GetDatabase(databaseName);
var ongoingRequestsCollection = mongoDb.GetCollection<RequestProcess>(ongoingRequestsCollectionName);
var completedRequestsCollection = mongoDb.GetCollection<RequestProcess>(completedRequestsCollectionName);

//create session
using var session = mongoClient.StartSession();

//start the transaction
session.StartTransaction();
try
{
    //add to completed requests collection
    await completedRequestsCollection.InsertOneAsync(requestObject);

    //delete from ongoing requests collection
    await ongoingRequestsCollection.DeleteOneAsync(req => req.Id == requestObject.Id);

    //commit transaction
    await session.CommitTransactionAsync();
}
catch (Exception)
{
    //abort transaction
    await session.AbortTransactionAsync();

    //throw the exception to handle further up the stack (knowing that the transaction failed)
    throw;
}

它在 session.StartTransaction() 行一直失败并出现异常,如下所示。

Exception thrown: 'System.NotSupportedException' in MongoDB.Driver.Core.dll

知道我做错了什么吗?我知道与数据库的连接很好,因为我可以执行读取、写入和删除。它只是不会执行此交易,但如果我删除与交易相关的功能,它会正常工作。

您应该提供整个异常消息,而不仅仅是类型,它通常可以让您了解更多细节。仅基于异常类型,您有:

  1. 您使用不支持事务的独立 mongod 服务器。
  2. 您没有可用的 mongod/mongos 服务器。如果它是恒定的行为并且您可以 运行 任何其他操作(find/insert/ping 等)这不是您的情况。

我会投票支持您使用独立服务器,因此您应该在副本集或分片服务器配置上替换它。