Запретить вставку дубликатов документов в базу данных Lotus Notes - PullRequest
0 голосов
/ 02 июня 2018

У меня есть ac # web api, размещенный в iis, у которого есть метод post, который берет список идентификаторов документов для вставки в базу данных 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);
   }
}

Даже при установленной блокировке я сталкиваюсь со сценариями, в которых вставляются дубликаты документов.Это потому, что запрос может быть выполнен в новом процессе?Как лучше всего предотвратить это?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вы можете захотеть сохранить вставленные идентификаторы в каком-то одноэлементном объекте или даже просто в статическом списке.И заблокируйте этот список - тот, кто получает блокировку, проверяет, что идентификаторы, которые он хочет вставить, не присутствует, а затем добавляет их в сам список.

Вам нужно хранить их только в течение короткого промежутка времени, простотак что 2 одновременных поста с одинаковым содержимым не обновляются, а обычный индекс просмотра обновляется.Поэтому лучше хранить временную метку вместе с идентификатором, чтобы вы могли очистить старые записи, если список будет длинным.

0 голосов
/ 02 июня 2018

Ваша проблема: getdocumentbykey зависит от актуальности индекса представления.На занятом сервере нет никакой гарантии, что это правда.Вы можете попытаться вызвать vw.Update, но, к сожалению, это не вызывает обновления индекса представления, так что это может произойти без какого-либо эффекта (он просто обновляет объект vw, чтобы представить то, что изменилось в бэкэнде, если бэкэнд сделалне обновлять, то ничего не делает).

Вместо этого вы можете использовать db.Search('IdField ="' & id & '"', Nothing, 0), так как поиск не зависит от перестраиваемого индекса.Это будет немного медленнее, но должно быть более точным.

...