Вопрос

У меня есть служба WCF, в которой доступны два метода:

Примечание:Служба wcf и sql server развернуты на одном компьютере.На Sql server есть одна таблица с именем employee, в которой хранится информация о сотруднике.

  1. Read() Этот метод извлекает всех сотрудников с sql server.
  2. Write() Этот метод записывает (добавляет, обновляет, удаляет) информацию о сотрудниках из таблицы employee в sql server.

Теперь я разработал настольное приложение, с помощью которого любой клиент может запрашивать, добавлять, обновлять и удалять информацию о сотрудниках, используя веб-сервис.

Вопрос:

Как я могу справиться со сценарием, если несколько клиентов хотят обновить информацию о сотрудниках одновременно?Справляется ли с этим сам sql server , используя блокировки базы данных ??

Пожалуйста, предложите мне наилучший подход!!

Это было полезно?

Решение

Как правило, в отключенной среде оптимистичный параллелизм с помощью rowversion/timestamp это предпочтительный подход.WCF ( ВКФ ) делает поддерживает распределенные транзакции, но это отличный способ ввести длительную блокировку в систему.Большинство инструментов ORM будут поддерживать rowversion/timestamp готовый к употреблению.

Конечно, в сервер возможно, вы захотите использовать транзакции (либо на основе подключения, либо TransactionScope) сделать отдельные методы репозитория "ACID", но я бы постарался избегать транзакций по проводам, насколько это возможно.


Повторные комментарии;извините за это, я, честно говоря, не видел этих комментариев;иногда stackoverflow не облегчает задачу, если вы получаете много комментариев одновременно.Здесь есть две разные концепции;ожидание является симптомом блокировки, но если у вас есть 100 клиентов, обновляющих одну и ту же запись, вполне уместно блокировать во время каждой транзакции.Чтобы все было просто:если я не могу продемонстрировать узкое место (требующее дополнительной работы), я бы начал с сериализуемый транзакция вокруг операций обновления (TransactionScope использует это по умолчанию).Таким образом, да:вы получаете соответствующую блокировку (ACID и т.д.) Для большинства сценариев.

Однако;вторая проблема - это параллелизм:если вы получаете 100 обновлений для одной и той же записи, как вы узнаете, какой из них доверять?Большинство систем позволят Первый обновите в и отбросьте остальные, поскольку они оперируют устаревшими предположениями о данных.Вот тут-то и появляется timestamp / rowversion .Применяя "временная метка / rowversion должна совпадать" в инструкции UPDATE, вы гарантируете, что пользователи смогут обновлять только те данные, которые не изменились с момента создания моментального снимка.Для этой цели обычно rowversion хранится рядом с любым интересно данные, которые вы обновляете.

Другие советы

Другой альтернативой является то, что вы могли бы создать экземпляр службы WCF как singleton (InstanceContext.Single) - что означает, что когда-либо был запущен только один ее экземпляр.Затем вы могли бы сохранить простой объект в памяти с целью блокировки обновления и заблокировать свой метод обновления на основе этого объекта.Когда поступают вызовы обновления из других сеансов, им придется подождать, пока не будет снята блокировка.

С уважением, Стив

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top