Доступ к информации базы данных в ASP.NET 2.0 - Изучение элемента управления пессимистичным параллелизмом
ОГЛАВЛЕНИЕ
Изучение элемента управления пессимистичным параллелизмом
Единственной гарантией того, что конфликты не будут происходить, может послужить ограничение на редактирование до одного пользователя за раз. Такие элементы управления параллелизма называются элементами управления пессимистичным параллелизмом. При использовании такого элемента управления необходимо иметь какой-нибудь механизм, где пользователь может заблокировать конкретную строку или целую таблицу базы данных, тем самым говоря: "Никто не может изменять данные записи, пока я не закончил!" Препятствием тут будет то, что мы не совсем в курсе, когда пользователь по-настоящему закончил редактировать записи. Если прошло 30 минут с того времени, как пользователи в последний раз загрузили страницу, значит ли это, что они всё еще редактируют информацию, и ее необходимо блокировать, или они уже закрыли свой обозреватель и ушли домой спать? Как вам уже стало ясно, используя элемент управления пессимистичным параллелизмом, необходимо выполнить некоторые действия для того, чтобы гарантировать блокировку данных, чтобы тем самым не предоставить другим пользователям возможность редактирования данных.
Из-за препятствий и неудобств в использовании данный элемент управления используется крайне редко. Он используется только тогда, когда конфликты просто- напросто не могут произойти. Обычным примером использования данного элемента является резервация. Если вы заказываете билет на концерт или на самолет через интернет, то очень важно удостовериться в том, что ваше место, бронируемое в течение некоторого времени, не будет забронировано другим клиентом. Для реализации данной гарантии многие системы позволяют вам выбрать место и затем блокируют его на некоторое время. Если вы завершите процесс покупки по окончании периода блокировки, то место остается за вами. Если же вы не успеваете осуществить покупку - по причине обеда, либо вы слишком медленно вводите информацию - то место становится "свободным".
ASP.NET не обладает встроенной поддержкой элемента управления пессимистичного параллелизма. Вам придется самому разбираться во всем в случае, если вам необходимо использовать данный элемент.
Обзор элемента управления оптимистичным параллелизмом
Пессимистичный параллелизм полезен в случаях, когда нарушения параллелизма не могут произойти ни под каким предлогом. Но в большинстве веб-приложений нарушения параллелизма не являются концом света. Оптимистичный параллелизм хоть и приобретает черты поведения типа "в выигрыше последний" (нет никакой блокировки или другого поведения для пользователей, изменяющих информацию), но он запрещает одному пользователю непреднамеренно переписывать изменения, внесенные другим пользователем. В случае, когда один пользователь переписывает изменения, сделанные другим (как в примере с менеджером A и менеджером B, приведеном ранее), изменения того, кто пытается переписать правку другого пользователя, отменяются. Вкратце, элемент управления оптимистичным параллелизмом останавливает все записи, непреднамеренно осуществляемые поверх других.
Существует множество способов реализации данного элемента управления . Стандартным способом является добавление какой-либо колонки с временем к таблице базы данных, которая записывает время последнего изменения для каждой строки. Когда пользователь начинает редактировать строку (нажав кнопку редактирования (Edit)), то данное время будет записано. Когда пользователь решит сохранить свои изменения (нажав кнопку обновления (Update)), то изменения будут приняты только тогда, когда временная метка будет совпадать с текущей меткой для данной строки. Если другой пользователь совершил какие-либо изменения в промежутке, когда данный пользователь нажал кнопку редактирования (Edit) и кнопку обновления (Update), временной штамп будет обновлен.
Microsoft предоставляет множество элементов управления оптимистичным параллелизмом посредством SqlDataSource. Вместо того, чтобы использовать временные метки, SqlDataSource обновляет оператор WHERE для выражений UPDATE и DELETE таким образом, что UPDATE и DELETE будут выполнены в случае, когда другие колонки в записи имеют те же значения, как и во время нажатия кнопки Edit.