Как заблокировать запись, когда два члена пытаются получить к ней доступ? - PullRequest
3 голосов
/ 05 июля 2010

У меня есть такой сценарий,

Моя среда .Net2.0, VS 2008, веб-приложение

Мне нужно заблокировать запись, когда два члена пытаются получить доступ одновременно.

Мы можем сделать это двумя способами,

  1. По интерфейсу (помещая идентификатор сессии и записывая уникальный номер в словарь и сохраняя его как статическую переменную или переменную приложения), мы освободим, когда ответ выйдет из этой страницы, клиент не подключится, после нажата кнопка сообщения, и сеанс завершен.

  2. По бэкэнду (блокировка записи в самой БД - нужно учиться - член моей команды ищет).

Есть ли какие-либо другие способы сделать, и мне нужно смотреть на другие пути на каждом шагу?

Я что-то пропустил?

Ответы [ 3 ]

6 голосов
/ 05 июля 2010

Вы не блокируете записи для клиентов, потому что блокировка записи для чего-то более чем на несколько миллисекунд - это почти самая разрушительная вещь, которую можно сделать в базе данных. Вместо этого следует использовать Оптимистичный параллелизм : вы определяете, была ли запись изменена с момента последнего чтения, и повторно пытаетесь выполнить транзакцию (например, вы повторно отображаете экран для пользователя). Как это будет реализовано, будет зависеть от того, какую технологию БД вы используете (ADO.Net, DataSets, Linq, EF и т. Д.).

Если бизнес-домен требует блокировочного поведения, они всегда реализуются как логика резервирования в базе данных: когда отображается запись, она «зарезервирована», чтобы другие пользователи не могли попытаться выполнить ту же транзакцию. Бронирование завершено или истекло или отменено. Но «резервирование» никогда не выполняется с использованием блокировок, это всегда явное обновление состояния с «доступно» на «зарезервировано» или что-то подобное.

Этот шаблон также описывает din P EAA: Оптимистическая блокировка в автономном режиме .

0 голосов
/ 05 июля 2010

Я согласен с Рамусом.Но все же, если вам это нужно.Создайте столбец с именем наподобие IsInUse в качестве битового типа и установите его в значение true, если вы обращаетесь к нему.Так как другие парни также будут нуждаться в тех же данных в то же время, тогда вам нужно сохранить приложение от сбоев ... поэтому в любом месте, откуда извлекаются данные, вы должны поставить флажок, если IsInUse равно False или нет.

0 голосов
/ 05 июля 2010

Если вы говорите только о чтении данных из записи из базы данных SQL-сервера, вам не нужно ничего делать !!! SQL-сервер сделает все, чтобы управлять множественным доступом к записям. но если вы хотите манипулировать данными, вы должны использовать Transaction s.

...