3

问题上下文: 有一段代码试图在 NServiceBus 消息处理程序中向 RavenDB 添加新文档。

编码:

partial void HandleImplementation(SomeMessage message)
{
    PutDataIntoCache(message.CacheKey, message.Document);
}

void PutDataIntoCache(string key, Document document)
{
    using (var documentStore = new DocumentStore { Url = "http://localhost:8084" })
    {
            documentStore.Initialize();
            using (IDocumentSession session = documentStore.OpenSession())
            {
                using (var tx = new TransactionScope())
                {
                    session.Store(document, key);
                    session.SaveChanges();
                    tx.Complete();
                }
        }
    }
}

错误

I'm getting the following error:
Raven.Abstractions.Exceptions.ConcurrencyException: A document with key: 'cache-fncwr10b' is currently created in another transaction
   at Raven.Client.Connection.ServerClient.DirectBatch(IEnumerable`1 commandDatas, String operationUrl) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\ServerClient.cs:line 863
   at Raven.Client.Connection.ServerClient.<>c__DisplayClass56.<Batch>b__55(String u) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\ServerClient.cs:line 837
   at Raven.Client.Connection.ServerClient.TryOperation[T](Func`2 operation, String operationUrl, Boolean avoidThrowing, T& result) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\ServerClient.cs:line 222
   at Raven.Client.Connection.ServerClient.ExecuteWithReplication[T](String method, Func`2 operation) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\ServerClient.cs:line 192
   at Raven.Client.Connection.ServerClient.Batch(IEnumerable`1 commandDatas) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\ServerClient.cs:line 837
   at Raven.Client.Document.DocumentSession.SaveChanges() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\DocumentSession.cs:line 441
   at CacheWarmer.Listener.Caching.UpdateCacheEntryProcessor.PutDataIntoCache(String key, ConfgDataModel confgDataModel) in UpdateCacheEntryProcessor.cs

问题 有没有人遇到过这个?你是怎么解决的?这可能是什么原因造成的?

任何有用的意见或提示将不胜感激!

4

3 回答 3

4

另外,不要DocumentStore在每次通话时都创建一个新的。

于 2012-08-01T15:37:59.613 回答
1

当您尝试从 2 个不同的 raven 客户端修改同一个文档时,或者当您在应用程序重新启动时将 resourceManagerId 设置为不同的值时,通常会发生此错误。我没有看到您在提供的代码中设置 ResourceManagerId,因此这可能是第一个问题。

如果您要从同一台机器上的多个客户端(在您的情况下为 NServiceBus 端点)修改相同的 raven 数据库,那么您需要为每个客户端(DocumentStore)指定一个 resourceManagerId。您可以在连接字符串中或通过在 DocumentStore 上设置 ResourceManagerId 属性来指定它。此 ID 在重新启动时应该是唯一且持久的。

于 2012-07-31T14:23:34.067 回答
0

如果你正确使用 NSB,你可以从你的尖峰代码中删除几乎所有的东西,并且只session.Store()在你注入的文档会话中写入。但是你需要为此连接一个IManageUnitOfWork。如果您有启用 DTC 的事务端点,则 TransactionScope 将已从 NSB 打开。

于 2012-08-07T04:52:11.353 回答