我在iis中托管了一个c#web api,它有一个post方法,它将一个文件ID列表插入到Lotus Notes数据库中。 post方法可以多次调用,我想防止插入重复的文档。
这是从帖子调用的代码(在静态类中):
lock (thisLock)
{
var id = "some unique id";
doc = vw.GetDocumentByKey(id, false);
if (doc == null)
{
NotesDocument docNew = db.CreateDocument();
//some more processing
docNew.Save(true, false, false);
}
}
即使锁定到位,我也会遇到插入重复文档的情况。是因为请求可以在新进程上执行吗?防止它发生的最佳方法是什么?
答案 0 :(得分:2)
您的问题是:getdocumentbykey取决于视图索引是最新的。在繁忙的服务器上,无法保证这是真的。您可以尝试调用vw.Update,但不幸的是,这不会触发视图索引的更新,因此它可能没有任何影响(它只是更新vw对象以表示后端中已更改的内容,如果后端执行了不更新,然后它什么都不做。)
您可以使用db.Search('IdField ="' & id & '"', Nothing, 0)
代替,因为搜索不依赖于要重建的索引。这会稍微慢一点,但应该更准确。
答案 1 :(得分:2)
您可能希望将插入的ID存储在某个单例对象中,甚至只是静态列表。并锁定此列表 - 谁获得锁定验证它要插入的ID不存在,然后将它们添加到列表本身。
您需要将它们保留很短的时间,以便具有相同内容的2个并发帖子不会更新,而正常视图索引会更新。因此,而不是在id中存储时间戳,因此如果列表变长,您可以清除旧记录。