我在C#中有类似下面的方法:
private void Save(object)
{
mongoCollection.Save(object);
someotherRelationaldb.Save(object);
}
我有两个DB,我必须保存一个对象。一个是MongoDB,另一个是关系DB SQL服务器。如果关系数据库上的提交失败,我想回滚MongoDB保存(我想保持保存的顺序)。使用C#驱动程序回滚的正确方法是什么。
答案 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();
}