RavenDb-如何在一个事务中保存对多个文档会话的更改?

RavenDb-如何在一个事务中保存对多个文档会话的更改?,ravendb,transactionscope,Ravendb,Transactionscope,在单个事务范围内,我尝试将数据保存到两个独立的Raven数据库(在同一个Raven服务器上) 但是,第二个会话中的更改不会保存到服务器 以下是我正在使用的代码: var documentStore = new DocumentStore { Url = "http://localhost:8081/" }; documentStore.Initialize(); documentStore.DatabaseCommands.EnsureDatabaseExists("database1");

在单个事务范围内,我尝试将数据保存到两个独立的Raven数据库(在同一个Raven服务器上)

但是,第二个会话中的更改不会保存到服务器

以下是我正在使用的代码:

var documentStore = new DocumentStore { Url = "http://localhost:8081/" };

documentStore.Initialize();

documentStore.DatabaseCommands.EnsureDatabaseExists("database1");
documentStore.DatabaseCommands.EnsureDatabaseExists("database2");

using (var ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    using (var session1 = documentStore.OpenSession("database1"))
    {
        session1.Store(new Entity {Id = "1"});
        session1.SaveChanges();
    }

    using (var session2 = documentStore.OpenSession("database2"))
    {
        session2.Store(new Entity {Id = "2"});
        session2.SaveChanges();
    }

    ts.Complete();
}
我可以看到
session1
中的更改保存到
database1
,但是
session2
中的更改不会保存到
database2
。我试过RavenDb build 992和build 2360

根据Raven文档,支持跨数据库的事务


如何从
session2
获取要提交的更改?

分布式事务需要时间提交。在检查结果之前,您可以使用
Thread.Sleep
短暂等待,也可以在检查结果的会话中设置特殊属性:

session.Advanced.AllowNonAuthoritativeInformation = false;
这看起来像一个bug,但实际上是经过设计的。阅读RavenDB文档


(仅供参考-在检查之前我也不知道。)

这应该行得通。如果不指定RequiresNew,是否有效?我尝试过不指定
TransactionScopeOption
以及TransactionScopeOption。必需,但它们都产生相同的结果-在
database2
中没有更改。似乎只有在第二个会话中抑制事务时,我才能提交第二个更改。i、 e.通过在
新TransactionScope(TransactionScopeOption.Suppress)
中包装
session2
,但这违背了让transactionAre在单元测试中执行此操作的目的?我能够重现您的结果,但只有当我立即以编程方式进行检查时。如果我在检查前只睡了10毫秒,那么它就起作用了。也许distribute事务需要时间来提交?我发现了这个问题,它是经过设计的。请看下面我的答案。谢谢Matt,这似乎是个时间问题。我在控制台应用程序中运行示例代码,该应用程序在事务有时间提交到第二个数据库之前退出。如果我在退出前睡眠100毫秒,我就可以在Raven Studio(build 2360)中的
database2
中看到数据。无论我线程运行多长时间,Raven build 992中都会出现错误。睡眠时间长,事务永远不会在第二个数据库上提交。Sleep似乎只适用于RavenDb的更高版本(例如build 2360)