Как заблокировать запись, когда два члена пытаются получить к ней доступ?
У меня есть такой сценарий,
Моя среда.Net2.0, VS 2008, веб-приложение
Мне нужно заблокировать запись, когда два члена пытаются получить доступ одновременно.
Мы можем сделать это двумя способами,
С помощью внешнего интерфейса (помещая идентификатор сессии и записывая уникальный номер в словарь и сохраняя его в качестве статической или прикладной переменной), мы освобождаем, когда ответ выходит из этой страницы, клиент не подключен, после нажатия кнопки отправки и сессия вышла
По бэкэнду (блокировка записи в самой БД - нужно изучать - член моей команды ищет).
Есть ли какие-то другие способы сделать, и мне нужно смотреть на другие пути в каждом шаге?
Я пропускаю какие-либо условия?
3 ответа
Вы не блокируете записи для клиентов, потому что блокировка записи на время, превышающее несколько миллисекунд, является почти самой разрушительной вещью, которую можно сделать в базе данных. Вместо этого следует использовать Optimistic Concurrency: вы обнаруживаете, изменилась ли запись с момента последнего чтения, и повторно пытаетесь выполнить транзакцию (например, вы повторно отображаете экран для пользователя). Как это будет реализовано, будет зависеть от того, какую технологию БД вы используете (ADO.Net, DataSets, Linq, EF и т. Д.).
Если бизнес-домен требует блокировочного поведения, они всегда реализуются как логика резервирования в базе данных: когда отображается запись, она "зарезервирована", чтобы другие пользователи не могли попытаться выполнить ту же транзакцию. Бронирование завершено или истекло или отменено. Но "резервирование" никогда не выполняется с использованием блокировок, это всегда явное обновление состояния с "доступно" на "зарезервировано" или что-то подобное.
Этот паттерн также описывает din EAAA: Оптимистичная блокировка в автономном режиме.
Я согласен с Рамусом. Но все же, если вам это нужно. Создайте столбец с именем наподобие IsInUse в качестве битового типа и установите его в значение true, если вы обращаетесь к нему. Так как другие парни также будут нуждаться в тех же данных в то же время, тогда вам нужно сохранить приложение от сбоев... поэтому в любом месте, откуда извлекаются данные, вы должны поставить флажок, если IsInUse имеет значение False или нет.
Если вы говорите только о чтении данных из записи из базы данных SQL-сервера, вам не нужно ничего делать!!! SQL-сервер сделает все, чтобы управлять множественным доступом к записям. но если вы хотите манипулировать данными, вы должны использовать транзакции s.