Как я могу реализовать атомарное параллельное чтение документа в RavenDB? - PullRequest
2 голосов
/ 03 января 2012

У меня следующая проблема, я реализую абстракцию очереди с RavenDB на сервере REST без сохранения состояния.

Предположим, у меня есть 2 вызова REST A и B

Когда происходит вызов A, я запрашиваю очередь для последнего элемента (элемент A) и отправляю его на вызов A.

Если вызов B вызывается одновременно с вызовом A, что может происходить с вызовами REST, мне нужно запретить программе давать вызову B тот же элемент, что и A, означающий, что элемент A должен быть «заблокирован» вызовом A .

Стандартной многопоточной защитой здесь будет простая блокировка. Как мне перевести эту идею в мою ситуацию с RavenDB и REST?

P.S Я использую Нэнси для REST-сервера

1 Ответ

5 голосов
/ 03 января 2012

Это не должно быть слишком сложно, если я что-то пропустил:

Введите флаг (логическое свойство) на ваши элементы, например, "Обработано".Внутри вашего действия откройте новый сеанс RavenDB и включите в него оптимистичный параллелизм (DocumentSession.Advanced .UseOptimisticConcurrency).Получите следующий необработанный элемент, а затем немедленно обновите его обработанный флаг до true.Вызовите .SaveChanges в вашем сеансе -> если это удастся (вы не получите ConcurrencyException), вы можете безопасно вернуть товар в результате запроса.Если нет, загрузите следующий элемент.

...