3

私はC#で以下のようなメソッドを持っています:

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

オブジェクトを保存する必要がある 2 つの DB があります。1 つは MongoDB で、もう 1 つはリレーショナル DB SQL サーバーです。リレーショナル DB のコミットが失敗した場合、MongoDB の保存をロールバックしたい (保存の順序を維持したい)。C# ドライバーを使用してロールバックする適切な方法は何でしょうか。

4

2 に答える 2

3

できません。
これを行う唯一の方法someotherRelationaldb.Save(object);は、try キャッチでラップし、キャッチで実行することです。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));
   }
}

もう 1 つの方法は、書き込みが成功したobjectに更新されるフラグ プロパティを に格納することです。someOtherRelationaldb

これも理想的ではありませんが、IsPersistedフラグが true のドキュメントのみを返すようにクエリを変更できます。

私は思いませんが、これらのアプローチはどちらも、非常に断片化された環境ではうまく機能しません。

于 2013-01-04T16:39:59.787 に答える