3

我的第一个想法是考虑一些工作单元模式,但是我正在做的事情非常小而且很轻,我想避免过度设计我的解决方案..

我想在多个 RavenDB 数据库中拥有一个事务范围.. 类似

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

你不能。会话旨在对单个数据库进行操作。

但是,您可以让两个会话参与同一事务。

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();
}

如果第二个操作因任何原因失败,第一个操作也将回滚 - 即使您已保存更改并完成了会话。

于 2012-12-28T02:17:22.237 回答