Параллельная обработка запросов в MVC3 / EF4 - PullRequest
1 голос
/ 13 декабря 2011

У меня есть список Games пользователей, которые могут присоединиться.Чтобы выбрать game, они должны выбрать position (то есть, роль) в этой игре.

Модель

[Game] 1 <-> * [PlayerGame] * <-> 0..1 [Player]

Объект PlayerGameопределяет выбранную позицию игроком.

Другие детали

  • Все игры перечислены в виде MVC 3. Просмотр.
  • Данныесохраняется в экземпляре SQL Server 2008 и доступен через EF4 (CodeFirst).
  • Представление обновляется через некоторые вызовы jQuery Get (), которые извлекают обновленные данные каждые N миллисекунды.
  • Чем больше задержка ( N ), тем больше шансов на гоночные условия, когда 2 пользователя будут пытаться выбрать одну и ту же позицию.
  • Мне, очевидно, потребуетсяВыполните некоторую проверку на стороне сервера, чтобы позволить только одному из 2 пользователей получить выбранную позицию, если они оба одновременно выбирают одну и ту же позицию.

Что будет лучшим способомдля оценки только 1 человек получает выбранную должность, а другой получает сообщение об ошибке?

В настоящее время я думаю об использовании TimeStamps, чтобы убедиться, что только 1 из 2 вызовов может успешно обновить строку PlayerGame.Это хорошая идея?

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Из вашего вопроса я могу предположить, что у вас также есть таблица [Positions]? если нет, то откуда они?

То есть вам не обязательно иметь метку времени, верно? Непосредственно перед тем, как вы сохраните свою сущность, сделайте что-то вроде entity.List().Where(x => x.GameId == requestedGameId && x.PositionId == requestedPositionId)

Тогда, если вы получаете ноль, и он еще не существует, его безопасно отправить, если вы все-таки получаете объект, позиция уже занята.

Примечание: я не очень знаком с синтаксисом структуры сущностей, просто догадываюсь, как он будет выглядеть, но вы, вероятно, понимаете, когда я имею в виду мой псевдокод

1 голос
/ 13 декабря 2011

Да, используйте метки времени.Этот способ обычно используется, и оба сервера SQL (любой сервер базы данных) и EF поддерживают их.Вам нужно будет передать метку времени клиенту и использовать ее при создании обновляемой сущности (в отдельном сценарии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...