amb*_*g36 7 c# database document-database ravendb
我有一个协调过程,由后台线程定期从外部Web服务检索对象ID列表,并尝试将缺少的实体添加到嵌入式RavenDb数据库.执行此过程的循环如下:
foreach (var pageId in listOfPageIds)
{
if ( _contentService.GetPageByPageId(pageId) == null)
{
_contentService.AddPage(pageId);
}
}
Run Code Online (Sandbox Code Playgroud)
的实施GetPageByPageId()和AddPage()如下:
public Page GetPageByPageId(string pageId)
{
using (var session = DocumentStore.OpenSession())
{
return session.Query<Page>().FirstOrDefault(page => page.PageId == pageId);
}
}
public bool AddPage(string pageId)
{
var page = GetPageByPageId(pageId);
if (page != null)
{
return false;
}
using (var session = DocumentStore.OpenSession())
{
var newPage = new Page() {PageId = pageId};
session.Store(newPage);
session.SaveChanges();
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
问题是如果列表有重复的id,一旦它添加第一个id并再次检查该id,结果将返回为空.就好像缺少一个可以注册新添加的实体的终结步骤.如果我稍后从另一个线程查询该集合,则返回具有该给定id的实体.任何人都可以看到这里的问题是什么?
谢谢,
Ste*_*ham 18
这是Raven采用的最终一致性模型的结果.由于写入而对索引的更新是异步发生的,因此很快就会执行读取将返回过时的结果.您可以更改查询以获得非陈旧的结果,如下所示:
session.Query<Page>().Customize(x => x.WaitForNonStaleResultsAsOfNow()).FirstOrDefault(page => page.PageId == pageId)
Run Code Online (Sandbox Code Playgroud)
Ayende在这篇博客文章中介绍了其他几个选项.
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |