如何在RavenDB中跨多个数据库维护IDocumentSession作用域?



我的第一个想法是考虑一些工作单元模式,但我所做的是相当小和轻量级的,我想避免过度设计我的解决方案。

我想有一个单一的事务范围跨多个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();
    }    
}

你不能。会话被设计为在单个数据库上操作。

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

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

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

最新更新