MongoDB 事务

3

我在C#中有一个如下的方法:

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

我有两个数据库,需要保存一个对象。一个是MongoDB,另一个是关系型数据库SQL Server。如果在关系型数据库上进行的提交失败了,我希望撤销MongoDB的保存(我希望维护保存的顺序)。使用C#驱动程序回滚的正确方法是什么。

2个回答

3
你不能这样做。
唯一的办法是在 someotherRelationaldb.Save(object); 外部包裹 try catch,在 catch 语句中执行 mongoCollection.Remove
你可能需要在 object 上使用已知的标识属性,例如:
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后得到更新。
这也不完全理想,但您可以修改查询以仅返回IsPersisted标志为真的文档。
虽然我认为这些方法都不适用于分片环境。

谢谢。我也是这么想的。我的保存可以是更新或插入 :) - ajp
在更新的情况下,您可能不想删除文档,而是将其恢复到更新之前的最后一个版本?这只是需要记住的一些事情。 - Alex
1
@Alex,如果保存操作抛出异常后,但在该项从MongoDB中删除之前,服务器崩溃了会发生什么?现在有更优雅的方法来处理这个问题吗(我注意到您的帖子是2013年发布的)。+1。 - w0051977

0

是的,

现在可以了。

例如Java;

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

了解更多关于mongodb事务的内容


抱歉,这只是mongodb和mongodb(同一个mongo)之间的简单事务。该问题讨论如何在mongodb和另一个关系型数据库之间创建事务。 - Payedimaunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接