【发布时间】:2019-03-04 18:30:49
【问题描述】:
在 ravendb 中,我试图解决一个竞争条件,即多个 url 可以同时添加到一个文档中。为了安全地执行此操作(并且不在集合中创建重复的条目),我需要条件检查和数组推送在数据库中以原子方式发生。例如,结构可能如下所示:
public class MyData
{
public string Id { get; set; }
public List<string> Urls { get; set; }
}
假设所有这三个操作都是异步发生的:
AddValue("foo");
AddValue("bar");
AddValue("foo");
我正在查看补丁,但我没有看到如何添加条件。有人可以给我举个例子来说明我可以如何做到这一点吗?
更新
这是我目前正在使用的
var listing = _session.Query<ListingData>()
.Where(l => l.ListingId == listingId && l.OwnerId == userId)
.ToList().SingleOrDefault();
if (listing == null)
return DataResult.NotFound;
_session.Advanced.Patch(
listing,
l => l.PhotoUrls,
urls => urls.Add(url));
_session.SaveChanges();
如果一切顺利,这似乎暂时有效,但如果有一些情况,例如,基于误报的应用程序端重试发生,那么我认为我最终会出现重复,因为
- 为了获取实体/ID,我必须进行一次往返
- 该操作只是简单地添加值而不先检查它是否存在
【问题讨论】:
标签: ravendb