Блокировка на уровне строки
Основным преимуществом блокировки на уровне строки является расширение доступа к базе данных для многих пользователей. При блокировке единственной редактируемой записи многим пользователям предоставляется доступ к большему объему данных без возникновения конфликтов блокировки или доступа к записям. Использование блокировки на уровне строки также позволяет разработчикам расширить границы использования пессимистической блокировки. Таким образом, пользователям предоставляются более знакомые и очевидные условия работы, в ходе которой они выполняют несложные операции открытия записи, ее редактирования и сохранения изменений. В предшествующих версиях 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.
Габлица 3 Значения свойства EditMode набора записей ADO
Константа | Описание |
adEditNone | Редактирование не выполняется. |
adEditInProgress | Данные в текущей записи изменились, но сохранение еще не выполнялось. |
adEditAdd | Данное значение свойство EditMode принимает после вызова метода AddNew. Оно показывает, что буфер копирования содержит еще не сохраненную новую запись. |
adEditDelete | Текущая запись была удалена. |
Значение свойства EditMode отражает состояние буфера, используемого для создания и редактирования записей. Оно используется, когда при выходе из режима редактирования выбран соответствующий метод (Update илиCancelUpdate).
Тестирование блокировок
Применяемые к записям блокировки можно протестировать, просмотрев значения свойствLockType и EditMode, но обычно гораздо более важно выяснить тип блокировки, налагаемой другим пользователем на требуемые данные. Единственный способ выполнения поставленной задачи фактически состоит в не-обходимости вызова ошибки конфликта доступа.
При возникновении ошибки провайдер OLEDB Jet выдает определенную информацию о типе блокировки, применяемой другим пользователем. В случае конфликта следует проверить свойство подключения:
Connection.Errors( index ). SQLState
для точного выяснения вида возникшей ошибки. В табл. 4 приводятся некоторые коды ошибок конф-ликта доступа, возвращаемые при обращении к свойству .SQLState.
Таблица 4 Коды ошибок блокировки, возвращаемые поставщиком Jet 4.0 OLEDB
Код | Сообщение |
3006 | Database <name> is exclusively locked. (База данных <имя> используется в монопольном режиме.) |
3008 | The table <name> is already opened by another user, or it's already open through the user interface and can't be manipulated programmatically. (База данных <имя> уже открыта другим пользователем, либо она открыта посредством пользовательского интерфейса, и ее программная обработка запрещена.) |
Таблица 4 Коды ошибок блокировки, возвращаемые провайдером Jet 4.0 OLEDB (продолжение)
Код | Сообщение |
3009 | You tried to lock table <tablename> while opening it, but the table can't be locked because it's currently in use. Wait a moment, and then try the operation again. (Предпринята попытка блокировки таблицы <имятаблицы>, но эта операция невозможна, поскольку в данный момент таблица используется. Подождите немного, а затем повторите попытку.) |
3027 | Can't update; database or object is read-only. (Обновление невозможно. База данных или объект доступен только для чтения.) |
3046 | Couldn't save; currently locked by another user. (Сохранение невозможно. Объект блокирован другим пользователем.) |
3158 | Couldn't save record; currently locked by another user. (Сохранение записи невозможно. Она блокирована другим пользователем.) |
3164 | The field can't be updated because another user or process has locked the corresponding record or table. (Обновление поля невозможно, поскольку соответствующая запись или таблица блокирована другим пользователем либо процессом.) |
3186 | Couldn't save; currently locked by user <name> on machine <name>. (Сохранение невозможно. Объект блокирован пользователем <имя> на компьютере <имя>.) |
3187 | Couldn't read; currently locked by user <name> on machine <name>. (Чтение невозможно. Объект блокирован пользователем <имя> на компьютере <имя>.) |
3188 | Couldn't update; currently locked by another session on this machine. (Обновление невозможно. Объект блокирован в течение другого сеанса работы на этом компьютере.) |
3189 | Table <name> is exclusively locked by user <name> on machine <name>. (Таблица <имя> блокирована в монопольном режиме пользователем <имя> на компьютере <имя>.) |
3197 | The Microsoft Jet database engine stopped the process because you and another user are attempting to change the same data at the same time. (Механизм баз данных Microsoft Jet остановил процесс вследствие одновременной попытки двух пользователей изменить одни и те же данные.) |
3202 | Couldn't save; currently locked by another user. (Сохранение невозможно. Объект блокирован другим пользователем.) |
3211 | The database engine couldn't lock table <name> because it's already in use by another person or process. (Механизм баз данных не выполнил блокировку таблицы <имя>, поскольку она уже используется другим лицом либо процессом.) |
3212 | Couldn't update; currently locked. (Обновление невозможно. Объект блокирован.) |
3218 | Couldn't update; currently locked by user <name> on machine <name>. (Обновление невозможно. Объект блокирован пользователем <имя> на компьютере <имя>.) |
3260 | Table <name> is exclusively locked by user <name> on machine <name>. (Таблица <имя> блокирована в монопольном режиме пользователем <имя> на компьютере <имя>.) |
3261 | Couldn't lock table <name>; currently in use by user <name> on machine <name>. (Блокировка таблицы <имя> невозможна. Таблица используется пользователем <имя> на компьютере <имя>.) |
Массив ошибок также содержит и другую потенциально полезную информацию об ошибке блокировки: данные о блокировке, используемой другим пользователем. Свойства NativeError и Number сообщают о блокировке, препятствующей выполнению требуемой операции. Сочетания этих свойств и их значения приведены в табл. 5.