MongoDB事务

时间:2013-01-04 16:34:27

标签: c# mongodb mongodb-.net-driver

我在C#中有类似下面的方法:

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

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

2 个答案:

答案 0 :(得分:2)

你不能。
唯一的方法是将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上存储一个标记属性,以便更新

这也不是很理想,但你可以修改你的查询,只返回IsPersisted标志为真的文档。

虽然我不这么想,但这些方法都不会在严重分片的环境中发挥出色。

答案 1 :(得分:1)

是的

现在可以。

例如Java;

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

See more about mongodb transactions