使用新事务时,RavenDB因ConcurrencyException而失败

使用新事务时,RavenDB因ConcurrencyException而失败,ravendb,Ravendb,此代码总是会因并发异常而失败: [Test] public void EventOrderingCode_Fails_WithConcurrencyException() { Guid id = Guid.NewGuid(); using (var scope1 = new TransactionScope()) using (var session = DataAccess.NewOpenSession)

此代码总是会因并发异常而失败:

    [Test]
    public void EventOrderingCode_Fails_WithConcurrencyException()
    {
        Guid id = Guid.NewGuid();
        using (var scope1 = new TransactionScope())
        using (var session = DataAccess.NewOpenSession)
        {
            session.Advanced.UseOptimisticConcurrency = true;
            session.Advanced.AllowNonAuthoritativeInformation = false;
            var ent1 = new CTEntity
            {
                Id = id,
                Name = "George"
            };
            using (var scope2 = new TransactionScope(TransactionScopeOption.RequiresNew))
            {

                session.Store(ent1);
                session.SaveChanges();
                scope2.Complete();
            }
            var ent2 = session.Load<CTEntity>(id);
            ent2.Name = "Gina";
            session.SaveChanges();
            scope1.Complete();
        }
    }
[测试]
public void EventOrderingCode_失败,并发异常()
{
Guid id=Guid.NewGuid();
使用(var scope1=newTransactionScope())
使用(var session=DataAccess.NewOpenSession)
{
session.Advanced.UseOptimisticConcurrency=true;
session.Advanced.allownonauthoritiveInformation=false;
var ent1=新的CTEntity
{
Id=Id,
Name=“乔治”
};
使用(var scope2=newtransactionscope(TransactionScopeOption.RequiresNew))
{
会话存储(ent1);
session.SaveChanges();
范围2.Complete();
}
var ent2=会话.Load(id);
ent2.Name=“Gina”;
session.SaveChanges();
scope1.Complete();
}
}
它在最后一次会话中失败。保存更改。说明它正在使用非当前etag。如果我对scope2使用Required而不是RequiresNew-即使用相同的事务。它起作用了

现在,由于我加载了实体(ent2),它应该使用最新的Etag,除非这是附加到我正在使用的scope1的某个缓存值(但我已禁用缓存)。因此,我不明白这为何会失败

我真的需要这个设置。在生产代码中,外部TransactionScope由NServiceBus创建,内部TransactionScope用于控制事件顺序的一个方面。它不能是同一事务

如果其他线程同时使用该实体,我也需要乐观并发


顺便说一句:这是使用Raven 2.0.3.0,因为没有人回答,所以我最好自己试一试

原来这是人为的错误。由于IOC容器的错误配置,DataAccess.NewOpenSession始终为我提供相同的会话(在其他测试中)。换句话说,Raven的工作方式与预期一致:)

在我发现这一点之前,我还尝试使用TransactionScopeOption.Suppress代替RequiresNew。这也起了作用。然后我必须确保我在被抑制的范围内所做的任何事情都不会失败。对我来说,这是一个有效的选择