我在 C# 中有如下方法:
private void Save(object)
{
mongoCollection.Save(object);
someotherRelationaldb.Save(object);
}
我有两个数据库,我必须在其中保存一个对象。一个是 MongoDB,另一个是关系数据库 SQL 服务器。如果关系数据库上的提交失败,我想回滚 MongoDB 保存(我想保持保存的顺序)。使用 C# 驱动程序回滚的正确方法是什么。
我在 C# 中有如下方法:
private void Save(object)
{
mongoCollection.Save(object);
someotherRelationaldb.Save(object);
}
我有两个数据库,我必须在其中保存一个对象。一个是 MongoDB,另一个是关系数据库 SQL 服务器。如果关系数据库上的提交失败,我想回滚 MongoDB 保存(我想保持保存的顺序)。使用 C# 驱动程序回滚的正确方法是什么。
你不能。
做到这一点的唯一方法是包裹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
flag 为 true 的文档。
尽管我认为这两种方法都不会在高度分片的环境中发挥良好的作用。
是的,
现在可以了。
例如Java;
try (ClientSession clientSession = client.startSession()) {
clientSession.startTransaction();
collection.insertOne(clientSession, docOne);
collection.insertOne(clientSession, docTwo);
clientSession.commitTransaction();
}