3

我在 C# 中有如下方法:

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

我有两个数据库,我必须在其中保存一个对象。一个是 MongoDB,另一个是关系数据库 SQL 服务器。如果关系数据库上的提交失败,我想回滚 MongoDB 保存(我想保持保​​存的顺序)。使用 C# 驱动程序回滚的正确方法是什么。

4

2 回答 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));
   }
}

另一种方法是在成功写入object更新的存储标志属性someOtherRelationaldb

这也不是很理想,但是您可以修改查询以仅返回IsPersistedflag 为 true 的文档。

尽管我认为这两种方法都不会在高度分片的环境中发挥良好的作用。

于 2013-01-04T16:39:59.787 回答
0

是的,

现在可以了。

例如Java;

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

查看更多关于 mongodb 事务的信息

于 2018-08-16T13:55:21.660 回答