C# MongoDB事务

C# MongoDB事务,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我在C中有一个类似于以下的方法: private void Save(object) { mongoCollection.Save(object); someotherRelationaldb.Save(object); } 我有两个数据库,我必须在其中保存一个对象。一个是MongoDB,另一个是关系数据库SQL server。如果关系数据库上的提交失败,我想回滚MongoDB保存,我想保持保存顺序。使用C驱动程序回滚的正确方法是什么 你不能。 实现这一点的唯一方法是包装一些其他R

我在C中有一个类似于以下的方法:

private void Save(object)
{
   mongoCollection.Save(object);
   someotherRelationaldb.Save(object);
}
我有两个数据库,我必须在其中保存一个对象。一个是MongoDB,另一个是关系数据库SQL server。如果关系数据库上的提交失败,我想回滚MongoDB保存,我想保持保存顺序。使用C驱动程序回滚的正确方法是什么

你不能。 实现这一点的唯一方法是包装一些其他RelationalDB.Saveobject;在try catch中,在catch上执行mongoCollection。移除

您可能需要对象上的已知标识符属性,然后可以执行以下操作:

mongoCollection.Remove(Query.EQ("_id", object.Id));
因此,您的Save方法看起来有点不整洁:

private void Save(object)
{
   mongoCollection.Save(object);

   try
   {
      someotherRelationaldb.Save(object);
   }
   catch
   {
      mongoCollection.Remove(Query.EQ("_id", object.Id));
   }
}
另一种方法是在成功写入someOtherRelationaldb后更新的对象上存储flag属性

这也不太理想,但您可以修改查询,只返回IsPersisted标志为true的文档

虽然我不认为这两种方法在严重碎片化的环境中都能发挥作用。

你不能。 实现这一点的唯一方法是包装一些其他RelationalDB.Saveobject;在try catch中,在catch上执行mongoCollection。移除

您可能需要对象上的已知标识符属性,然后可以执行以下操作:

mongoCollection.Remove(Query.EQ("_id", object.Id));
因此,您的Save方法看起来有点不整洁:

private void Save(object)
{
   mongoCollection.Save(object);

   try
   {
      someotherRelationaldb.Save(object);
   }
   catch
   {
      mongoCollection.Remove(Query.EQ("_id", object.Id));
   }
}
另一种方法是在成功写入someOtherRelationaldb后更新的对象上存储flag属性

这也不太理想,但您可以修改查询,只返回IsPersisted标志为true的文档

虽然我不认为这两种方法在严重碎片化的环境中都能发挥作用。

是的

现在可能了

例如Java

try (ClientSession clientSession = client.startSession()) {
   clientSession.startTransaction();
   collection.insertOne(clientSession, docOne);
   collection.insertOne(clientSession, docTwo);
   clientSession.commitTransaction();
}

现在可能了

例如Java

try (ClientSession clientSession = client.startSession()) {
   clientSession.startTransaction();
   collection.insertOne(clientSession, docOne);
   collection.insertOne(clientSession, docTwo);
   clientSession.commitTransaction();
}

谢谢我想是的。。我的保存可以是更新或插入:在更新的情况下,您可能不想删除文档。。但是否将其恢复到更新前的最后一个版本?只不过是一件可以保存的东西mind@Alex,如果服务器在save抛出异常后崩溃,但在从MongoDB中删除该项之前会发生什么情况?现在我注意到你的帖子日期是2013年,有没有更优雅的方式来处理这个问题呢+1.谢谢。。我想是的。。我的保存可以是更新或插入:在更新的情况下,您可能不想删除文档。。但是否将其恢复到更新前的最后一个版本?只不过是一件可以保存的东西mind@Alex,如果服务器在save抛出异常后崩溃,但在从MongoDB中删除该项之前会发生什么情况?现在我注意到你的帖子日期是2013年,有没有更优雅的方式来处理这个问题呢+1.