Смекни!
smekni.com

База данных Access. Особенности работы в многопользовательском режиме (стр. 3 из 5)

Блокировка на уровне строки

Основным преимуществом блокировки на уровне строки является расширение доступа к базе данных для многих пользователей. При блокировке единственной редактируемой записи многим пользователям пре­доставляется доступ к большему объему данных без возникновения конфликтов блокировки или доступа к записям. Использование блокировки на уровне строки также позволяет разработчикам расширить гра­ницы использования пессимистической блокировки. Таким образом, пользователям предоставляются бо­лее знакомые и очевидные условия работы, в ходе которой они выполняют несложные операции открытия записи, ее редактирования и сохранения изменений. В предшествующих версиях 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.