#multithreading #design-patterns #concurrency #multiprocessing #race-condition
Вопрос:
Я пытаюсь решить проблему параллелизма в своей системе, не пытаясь использовать блокировки. Так что пока я не могу придумать никакого решения этой проблемы. Любые предложения / идеи окажут большую помощь.
Сценарий:
В моей системе существует два типа сущностей (хранятся отдельно в базах данных):
- Документы (может быть большое количество документов)
- Шаблоны для классификации этих документов. Шаблоны содержат атрибуты, и документы, соответствующие этим атрибутам, становятся членами шаблонов.
В шаблонах и документах отсутствует последовательность действий. Действие на обоих может происходить параллельно в любой момент времени.
В шаблонах выполняются следующие действия
- Создание нового шаблона приводит к созданию первой версии шаблона
- Любое обновление шаблона приводит к созданию более новой версии шаблона
- Создание и обновление шаблона приводит к запросу на сопоставление документов, соответствующих шаблону, и список идентификаторов документов сопоставляется и сохраняется вместе с шаблоном.
Следующие действия могут произойти с документами в любое время:
- Могут быть добавлены новые документы
- Существующие свойства документа могут быть изменены
- Существующие документы могут быть удалены
Каждая из вышеуказанных операций с документами приводит к переоценке принадлежности документа к шаблону, и документ текущей версии шаблона обновляется, чтобы отразить правильный набор идентификаторов документов, которые являются членами шаблона. Например: при добавлении нового документа проверяется, соответствуют ли его атрибуты атрибутам в текущей версии шаблона, и если да, то он добавляется в список идентификаторов документов в шаблоне.
Проблема параллелизма возникает в основном в документе шаблона и в его списке хранилища идентификаторов документов-членов. Поскольку обновление списка документов-членов для шаблона может происходить параллельно между созданием / обновлением шаблона и созданием / обновлением различных документов, это может привести к неправильным данным, если они не обрабатываются правильно.
Прямо сейчас это решается с помощью блокировки, при которой создание / обновление шаблона и создание / обновление документов являются взаимоисключающими.
Существуют ли какие — либо механизмы, с помощью которых параллелизм может обрабатываться без блокировок?