Visual Basic 6. Руководство разработчика


Типы курсоров и механизмы блокировки


Курсор (cursor) - это совокупность данных, на которых основан объект RecordSet. Объект RecordSet — набор отобранных записей. Программист видит базу данных в терминах таблиц, состоящих из записей, где каждая строка образована полями. Однако ADO не видят таблицу, а только курсор, который содержит информацию, позволяющую представить записи для приложения в виде строк с полями. Существует четыре типа курсоров: Dynamic, Keyset, Static и Forward-Only.

Чтобы задать, какой тип курсора больше всего подходит для приложения, используйте свойство CursorType.

Его значения приведены в табл. 18.1.

Свойство CursorType задается перед открытием объекта RecordSet. Если тип курсора не задан, то по умолчанию ADO откроет Forward-Only курсор.

Свойство CursorLocation (Место расположения курсора).

В дополнение к типу курсора можно устанавливать и его место расположения, используя свойство CursorLocation. Обычно курсор открывается на сервере, но можно его открыть и на машине-клиенте. Клиентский курсор ускоряет работу приложения при условии, что нет необходимости сразу вносить изменения в базу данных. Клиентский курсор — Static, и может изменять базу данных только через пакетные изменения (приложение модифицирует RecordSet, а затем передает его на сервер).

Примечание

Пакетные изменения — это довольно сложная тема, и она не рассматривается в этой книге. Более подробную информацию о пакетных изменениях можно получить из документации по методу UpdateBatch объекта RecordSet.

Свойство LockType (Тип блокировки). Другое важное свойство объекта RecordSet -это свойство LockType, которое определяет тип блокировки записей при их редакти­ровании. Устанавливать свойство LockType следует перед открытием объекта RecordSet. Свойство LockType может принимать одно из значений, перечисленных в табл. 18.2.

Примечание

С клиентским объектом RecordSet свойство LockType может быть установлено только в LockOptimisticBatch.

Таблица 18.1. Значения свойства CursorType



Тип курсора

Константа

Описание

Dynamic

adOpenDynamic

RecordSet синхронизируется с записями в базе данных. Позволяет просматривать добавления, изменения и удаления, сделанные другими пользователями, и поддерживает все методы перемещения

Keyset

adOpenKeySet

Ведет себя так же, как и курсор типа Dynamic, но не позволяет видеть записи, которые другие пользователи добавили или удалили. Видны только изменения, внесенные другими пользователями в отобранные записи. Поддерживает все методы перемещения

Static

adOpenStatic

Предоставляет статическую копию отобранных записей. Поддерживает все методы перемещения, но не позволяет увидеть изменения, сделанные другими пользователями.

Forward-only

adOpenForwardOnly

Аналогичен курсору типа Dynamic, с той лишь разницей, что позволяет просматривать записи только в направлении вперед. Это улучшает производительность, если нужно сделать только один проход по RecordSet

<
Таблица 18.2. Значение свойства LockType

Значение

Константа

Описание

Read-only

adLockReadOnly

RecordSet открывается только для чтения. Используйте этот тип блокировки, чтобы предотвратить изменения данных

Pessimistic locking

adLockPessimistic

Предоставляет возможности, необходимые для успешного редактирования данных. Блокировка записи источника данных устанавливается немедленно после начала редактирования (т.е. вызова метода Edit — прим. ред.)

Optimistic locking

adLockOptimistic

Блокировка включается только после вызова метода Update

Optimistic batch updates

adLockBatchOptimistic

Используется для режима пакетных изменений

Другой важный аспект ADO - контроль одновременного доступа. В то время, когда один из пользователей отредактировал некоторые записи, но не успел записать изменения в базу, другие пользователи могут модифицировать те же записи. Как определить, чьи изменения будут записаны поверх других? Для ответа на этот вопрос необходимо понимать, как работают оптимистическая и пессимистическая блокировки.

Пессимистическая блокировка.

Пессимистическая блокировка - это надежный метод упорядочивания доступа к базе данных, имеющий серьезные ограничения. При пессимистической блокировке закрыты все страницы, содержащие отобранные записи. Другие пользователи могут в это время только читать записи, принадлежащие блокированным страницам. Достоинством пессимистической блокировки является то, что ее использование упрощает код. Однако, если пользователь откроет RecordSet, а затем отлучится с рабочего места, то соответствующие станицы могут оставаться заблокированными очень долгое время. Использовать пессимистическую блокировку лучше для небольших RecordSet, содержащих единственную страницу.

Оптимистическая блокировка. Блокируются только страницы, содержащие редактируемые записи, причем только на время записи изменений. Этот метод блокировки выглядит весьма привлекательно, но не решает проблем, возникающих при одновременном доступе. Два пользователя открывают для редактирования одни и те же записи. Один из них заносит изменения в базу данных. После этого второй пользователь имеет устаревшую версию записей. ADO не извещает пользователя о том, что записи изменились. Так что же должно делать приложение: записать изменения поверх, известить пользователя или что-то еще?

Ответ на этот вопрос зависит от требований приложения. Необходимо написать код, который определит, были ли записи изменены с момента прочтения (для этого можно использовать специальные поля или прочесть вновь оригинальные записи из базы данных, закрыть их и сравнить с записями, которые были прочитаны вначале), и обновить, если они были изменены. Кроме того, следует известить пользователя об изменениях в базе данных и предоставить ему список команд для выбора последующих действий (записать поверх, прервать или начать редак­тирование заново).


Содержание раздела