Пессимистическая блокировка является противоположностью оптимистической. При пессимистической блокировке записи или страницы она становится недоступной для других пользователей с момента начала редактирования записи до момента ее сохранения. Такой способ блокировки используется многими другими базами данных, поэтому он знаком большинству разработчиков, а его результаты не должны вызывать вопросов у пользователей. Хотя пессимистическая блокировка исключает присущие оптимистической блокировке конфликты доступа при записи изменений, она также не лишена недостатков.
При использовании пессимистической блокировки вероятность конфликтов при обращении к данным может быть уменьшена. Когда используется блокировка на уровне страницы, появляется дополнительная проблема, связанная с блокировкой всех записей на странице в течение определенного периода времени. Если обычно процесс редактирования оказывается достаточно длительным и существует много конкурирующих пользователей, пессимистическую блокировку следует применять с осторожностью. В некоторых приложениях, например баз данных для хранения информации о продажах и товарах, вероятно, предпочтение следует отдавать пессимистической блокировке, поскольку основные операции связаны с обработкой существующих записей. В то же время для систем отслеживания изменений данных во времени пессимистическая блокировка негативно отражается на производительности. Большинство касающихся пессимистической блокировки предупреждений и оговорок относятся к способу страничной блокировки в Access. Теперь, когда в Access имеется возможность выполнять блокировку на уровне строки, пессимистическая блокировка должна получить более широкое распространение и применение.
Блокировка на уровне строки
Основным преимуществом блокировки на уровне строки является расширение доступа к базе данных для многих пользователей. При блокировке единственной редактируемой записи многим пользователям предоставляется доступ к большему объему данных без возникновения конфликтов блокировки или доступа к записям. Использование блокировки на уровне строки также позволяет разработчикам расширить границы использования пессимистической блокировки. Таким образом, пользователям предоставляются более знакомые и очевидные условия работы, в ходе которой они выполняют несложные операции открытия записи, ее редактирования и сохранения изменений. В предшествующих версиях Access пессимистическая блокировка не могла получить широкого распространения, поскольку страничный способ блокировки ограничивал количество одновременно работающих пользователей, которые должны были мириться с возможностью блокировки внесенных ими изменений другими пользователями. При этом разработчикам приходилось создавать схемы реализации привычных для пользователей условий работы (расширяющиеся записи, временные таблицы и т.п.). Блокировка на уровне строки является главным достижением в Jet 4.0. Она должна найти csoe применение в наиболее популярных и надежных приложениях.
Свойство RecordLocks и связанные интерфейсные элементы
При открытии в Access связанной формы или набора записей имеется возможность наложения блокировки на соответствующий набор записей. Конечно, эти параметры можно использовать только при работе с Jet, тогда как при использовании конфигурации приложения Access клиент-сервер предполагается установка режима No Locks (отсутствует).
Существует три режима блокировки:
• No Locks (отсутствует) - эквивалентен оптимистической блокировке,
• Edited Records (изменяемой записи) - эквивалентен пессимистической блокировке,
• All Records (всех записей) - блокировка всех записей набора. В многопользовательских приложениях этот режим следует использовать с осторожностью.
СОВЕТ
Связывание пользовательского интерфейса с данными является простым способом предоставления пользователям доступа к данным, но при этом теряется контроль над данными. В связанной с пессимистически блокированной записью форме пользователь увидит в панели выбора записи символ "перечеркнутое О", но информация о том, кто заблокировал запись, отсутствует. Если панель выбора записи не отображается, пользователь услышит звуковой сигнал.
Методы блокировки в Jet
Блокировка - обычное и необходимое явление в базе данных. Чтобы убедиться в корректности типа и установить продолжительность блокировки, необходимо при ее появлении иметь возможность получать о ней информацию. Данный раздел будет полезен при анализе особенностей блокировки в приложении, который проводится для проверки соответствия возможностей приложения цели, с которой оно создавалось.
Определение состояния блокировки
Как отмечалось ранее, фактическая блокировка записи или страницы записей происходит в различное время, а сама блокировка может быть оптимистической либо пессимистической. Кроме того, разные части приложения (или разные приложения) могут использовать различные виды блокировки тех же записей в то же самое время. Поэтому в разные моменты времени будут возникать различные ошибки. Возникающая ошибка зависит от состояния блокировки.
В ADO существует свойство набора записей LockType, содержащее информацию о применяемом к записям типе блокировки. Это свойство доступно для чтения и записи до момента открытия набора записей, если набор записей уже открыт, оно доступно только для чтения. Значения свойства LockType для Microsoit.Jet.OLEDB.4.0 приводятся в табл. 2. При использовании других поставщиков могут применяться иные константы. Для определения поддерживаемых поставщиком параметров следует использовать метод. Supports с параметрами adUpdate либо adUpdateBatch.
Таблица 2 Константы для свойства LockType в Jet 4.0 при использовании провайдера Microsoft.Jet.OLEDB.4.0
Константа | Описание |
adLockReadOnly | Значение, принятое по умолчанию. Набор записей не может изменяться, открывается только для чтения, и к данным не применяются никакие блокировки. |
adLockPessimistic | Пессимистическая блокировка при редактировании. |
adLockOptimistic | Оптимистическая блокировка при вызове обработчика события Update. |
adLockBatchOptimistic | Оптимистическая блокировка для режима группового обновления. |
ПРИМЕЧАНИЕ
Если свойство CursorLocation имеет значение adUseClient, значение adLockPessimistic не поддерживается, однако при этом ошибка возникать не будет. Jet подставляет в свойство LockType другое подходящее значение. Так происходит потому, что при использовании значения adUseClient сервер не отслеживает состояние текущей записи, и поэтому пессимистическая блокировка невозможна.
ПРИМЕЧАНИЕ
ADOR является подмножеством объектной модели ADO и содержит только объекты RecordSet и Field. Он может создаваться специально либо передаваться от сервера клиенту. Объект ADOR поддерживает единственное значение свойства LockType - adLockBatchOptimistic.
При разработке, тестировании и поддержке приложения важно иметь информацию о состоянии блокировки записи. Необходимо проверить соответствие каждого процесса обработки данных требованиям, предъявляемым к приложению. Подобная процедура затруднений не вызывает. Следует остановить выполнение программы и проверить значение свойства набора записей LockType (рис. 1).
РИСУНОК 1 Свойство LockType отображает •остояние блокировки набора wnuceu.
Для индикации режима редактирования набора записей предназначено другое свойство. До вхождения в режим редактирования свойство EditMode содержит значение adEditNone. Во время редактирования записи оно содержит значение adEditInProgress. После успешного обновления записи свойство EditMode вновь принимает значение adEditNone. Остальные значения свойства EditMode описываются в табл. 3.