2015-05-21 4 views
3

У меня есть метод контроллера WebAPI POST, который в основном просто вставляет запись с величиной количества в таблицу. Мне нужно проверить это количество на доступное количество. Проблема в том, что я могу одновременно представлять несколько представлений и хочу устранить любые возможные условия гонки.WebAPI Предотвращение условий гонки

Существует множество способов сделать это, но я пытаюсь определить наилучший подход. Я думал об использовании очереди, но затем клиентскому устройству нужно будет сделать чек обратно, чтобы посмотреть состояние. Я думал об использовании шаблона singleton, но тогда клиенту придется ждать его выпуска.

У кого-нибудь есть указатели?

+0

можно изменить ваш контроллер, чтобы обрабатывать 2 значения, второе значение является меткой времени.? – MethodMan

+0

Это может быть полный контроль над функциональностью. Просто должен остаться RESTful. –

+0

Если это все происходит на одном сервере, все, что вам нужно сделать, это создать объект статической блокировки и использовать этот же объект блокировки во время обновления и чтения. это предотвратит путаницу в БД. В противном случае вы можете заблокировать эту запись, даже если вы ее прочитали. Но это не имеет ничего общего с Web Api. Это проблема параллелизма. –

ответ

4

Ваш вопрос не связан с WebAPI, а с вашими данными и уровнем управления данными. WebAPI не должен заботиться о данных, его роль заключается в том, чтобы принимать запросы и отправлять ответы. Ответ зависит от входных данных, валидации, бизнес-логики и т. Д.

Ваш вопрос - классический вопрос управления параллелизмом. Есть много ответов, и правильный будет зависеть от вашей системы и архитектуры.

Я предполагаю, что транзакция с базой данных включает в себя следующие этапы? : 1) Новая запись с цифрой 2) Количество обновления (новое общее = всего - штук) И они должны произойти вместе или вообще не произойти?

Один способ пойти Optimistic Concurrency. Пусть база данных (или ваша ORM (i.e Entity Framework)) сообщит вам, если счетчик количества не является устаревшим, если он устарел, запросите его снова и подтвердите, что доступное количество остается в силе.

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

+0

Проблема с использованием оптимистического параллелизма - это схема базы данных. Доступное количество сохраняется в одной записи, в то время как сумма другого набора записей указывает на принятое. Таким образом, параллельные вставки во вторую таблицу могут создать избыточное количество. Именно это и привело меня к решению очереди. При этом клиент может подождать, и очередь никогда не будет большой, поэтому я надеялся ограничить ее в слое API или BLL. –

+0

, если все операции выполняются через ваш API, и нет другого способа повлиять на доступное количество и сумму «принятых записей» (т. Е. Dba или другой системы, вставляющей записи), тогда вы могли бы вычислить полученную сумму один раз (в системе например, запуск) и сохранить его в счетчике? Загружайте его во время транзакций и обновляйте его при каждой операции. Это ускорит вашу систему и избавит от необходимости вычислять сумму каждый раз. ПостскриптумЯ предлагаю вам переместить этот вопрос в programers.stackexchange. Потому что это больше вопрос дизайна. У него будет больше взглядов и идей. –

Смежные вопросы