我有一个托管在iis中的lotus web,它有一个post方法,该方法获取要插入到c# notes数据库中的文档in列表。post方法可以被多次调用,我希望防止插入重复的文档。
这是从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);
}
}
即使有了锁,我也会遇到插入重复文档的情况。是因为可以在新进程上执行请求吗?防止这种情况发生的最好方法是什么?
发布于 2018-06-02 21:42:39
你的问题是: getdocumentbykey依赖于视图索引的更新。在繁忙的服务器上,不能保证这是真的。您可以尝试调用vw.Update,但不幸的是,这不会触发视图索引的更新,因此它可能没有任何影响(它只更新vw对象以表示后端中发生的更改,如果后端没有更新,则它什么也不做)。
您可以改用db.Search('IdField ="' & id & '"', Nothing, 0)
,因为搜索不依赖于要重建的索引。这会稍微慢一点,但应该更准确。
发布于 2018-06-03 00:38:43
您可能希望将插入的ids存储在某个单例对象中,或者甚至是简单的静态列表中。和这个列表上的锁-任何获得锁的人都会验证它想要插入的ids不存在,然后将它们添加到列表本身。
你只需要在很短的时间内保存它们,这样两个具有相同内容的并发帖子就不会更新,而且普通的视图索引也会更新。因此,将时间戳与id一起存储,以便在列表变长时可以清除较旧的记录。
https://stackoverflow.com/questions/50655315
复制相似问题