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 に答える