3

My first thought is to consider some unit of work pattern, but what I'm doing is pretty small and lightweight and I want to avoid overengineering my solution..

I would like to have a single transaction scope across more than one RavenDB database.. something like

class WidgetFacade
{
    void SaveData (Widget widget, User user)
    {
          IDocumentStore documentStore = new DocumentStore { Url = "http://server:8080/" };

          IDocumentSession session  = documentStore.OpenSession("database1");
          session.Store(user);

          session = documentStore.OpenSession("database2");
          session.Store(widget);
          session.Savechanges();
          session.Dispose();
    }    
}
4

1 に答える 1

4

できません。セッションは、単一のデータベースで動作するように設計されています。

ただし、2 つのセッションを同じトランザクションに参加させることはできます。

var documentStore = new DocumentStore { Url = "http://server:8080/" };

using (var ts = new TransactionScope())
{
   using (var session = documentStore.OpenSession("database1"))
   {
      session.Store(user);
      session.SaveChanges();
   }

   using (var session = documentStore.OpenSession("database2"))
   {
      session.Store(widget);
      session.SaveChanges();
   }

   ts.Complete();
}

2 番目の操作が何らかの理由で失敗した場合、変更を保存してセッションを完了していても、最初の操作もロールバックされます。

于 2012-12-28T02:17:22.237 に答える