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

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

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

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

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

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

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

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

Я пропускаю какие-либо условия?

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам