Типы курсоров и механизмы блокировки
Курсор (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 |
Используется для режима пакетных изменений |
Пессимистическая блокировка.
Пессимистическая блокировка - это надежный метод упорядочивания доступа к базе данных, имеющий серьезные ограничения. При пессимистической блокировке закрыты все страницы, содержащие отобранные записи. Другие пользователи могут в это время только читать записи, принадлежащие блокированным страницам. Достоинством пессимистической блокировки является то, что ее использование упрощает код. Однако, если пользователь откроет RecordSet, а затем отлучится с рабочего места, то соответствующие станицы могут оставаться заблокированными очень долгое время. Использовать пессимистическую блокировку лучше для небольших RecordSet, содержащих единственную страницу.
Оптимистическая блокировка. Блокируются только страницы, содержащие редактируемые записи, причем только на время записи изменений. Этот метод блокировки выглядит весьма привлекательно, но не решает проблем, возникающих при одновременном доступе. Два пользователя открывают для редактирования одни и те же записи. Один из них заносит изменения в базу данных. После этого второй пользователь имеет устаревшую версию записей. ADO не извещает пользователя о том, что записи изменились. Так что же должно делать приложение: записать изменения поверх, известить пользователя или что-то еще?
Ответ на этот вопрос зависит от требований приложения. Необходимо написать код, который определит, были ли записи изменены с момента прочтения (для этого можно использовать специальные поля или прочесть вновь оригинальные записи из базы данных, закрыть их и сравнить с записями, которые были прочитаны вначале), и обновить, если они были изменены. Кроме того, следует известить пользователя об изменениях в базе данных и предоставить ему список команд для выбора последующих действий (записать поверх, прервать или начать редактирование заново).