Использование блокировки страниц

Как уже говорилось, в течение длительного периода в Access не существовало возможности непосред­ственной блокировки отдельных записей, предоставлялась лишь блокировка целых страниц. Чтобы исполь­зовать преимущества более высокой производительности при задействовании страничной блокировки, необходимо отключить установленный по умолчанию параметр блокировки на уровне строк. Для этого следует выполнить команды меню Tools / Options [ Advanced и отключить флажок Open databases with row-level locking (Блокировка записей при открытии базы данных).

Обработка ошибок блокировки при работе в многопользовательской среде

Любая многопользовательская система должна предвидеть ошибки блокировки. Различные системы обрабатывают возникающие в определенных ситуациях ошибки по-разному. Кроме того, в случаях возник­новения ошибок блокировки различные системы предоставляют разработчикам и пользователям неодина­ковую информацию. В данном разделе рассматриваются некоторые настройки блокировки и связанные с нею ошибки, с которыми чаще всего приходится сталкиваться при разработке приложений в Access 2000. Здесь также поясняются некоторые технологии предотвращения и обработки этих ошибок.

Настройки блокировки Access

Лучший способ обработки возникающих при работе в многопользовательской среде ошибок состоит в их предотвращении. В Access имеется несколько свойств, которые можно использовать для снижения ча­стоты возникновения конфликтов доступа. Соответствующие параметры можно отыскать во вкладке Advanced диалогового окна Options. Однако сами по себе они не осуществляют обработку подобных ошибок.

• Number of Update Retries (Число повторов обновления) - управляет количеством попыток, кото­рые Access предпринимает при сохранении или обновлении заблокированной записи. Допустимые значения находятся в интервале 0-10.

• ODBC Refresh Interval (Период обновления ODBC (с)) - период обновления в секундах при ис­пользовании базы данных ODBC. Допустимые значения находятся в интервале 1-32766.

• Refresh Interval (Период обновления (с)) - период обновления записей в секундах в режиме про­смотра Datasheet (Таблица) или Form (Форма). Допустимые значения находятся в интервале 1-32766.

• Update Retry Interval (Период повтора обновления (мс)) - промежуток времени в миллисекундах, по истечении которого Access предпринимает следующую попытку сохранения измененной записи, которая ранее была блокирована. Допустимые значения находятся в интервале 1-1000.

Конфликт записи

Ошибка Write Conflict (Ошибка конфликта при записи) (см. табл. 4, ошибка 3197) является одной из наиболее неприятных ошибок, возникающих при работе приложения Access в многопользовательской среде. Она возникает в случаях, когда пользователь А открывает запись с оптимистической блокировкой и во время ее редактирования к ней обращается пользователь Б, изменяя и сохраняя ее. Когда пользо­ватель А завершает работу над записью и предпринимает попытку ее сохранения, он получает сообще­ние об ошибке. В предшествующих версиях Access в подобных ситуациях отображалось маловразумительное диалоговое окно, в котором предлагалось перезаписать изменения другого пользователя (при этом не со­общалось, какие именно), отказаться от только что внесенных изменений (что никогда не пользовалось популярностью) либо скопировать данные в буфер обмена (и что делать дальше?).

В настоящее время способ внутренней обработки ошибок подвергся изменениям. В Access 2000 конф­ликт записи приводит к игнорированию внесенных пользователем А изменений. Хотя подобная мера кажется излишне суровой, она наилучшим образом соответствует ситуации, когда большинство многополь­зовательских приложений Access поспешно создаются людьми, которые не всегда достаточно хорошо разбираются в вопросах многопользовательского применения. По крайней мере, такая обработка конфликта записи является решительной и окончательной, а пользователям не придется искать ответ на вопрос, над которым они никогда не задумывались. Если приложение должно обрабатывать конфликт записи иным способом, необходимо создать пользовательскую процедуру обработки ошибки.

Блокированная запись

Когда в ходе обычного использования приложения пользователь А пытается изменить запись, редак­тируемую пользователем Б, первый из них получит сообщение об ошибке 3260 (Запись блокирована - см. табл. 4). Как правило, подпрограмма обработки ошибок предпринимает заданное число попыток со­хранения записи пользователя А перед тем, как предложить ему подтвердить необходимость дальнейших попыток либо отказаться от изменения записи. Если примененная пользователем Б блокировка является пессимистической, она снимается сразу после обновления записи в базе данных. Как правило, этот пе­риод времени очень короток.

Транзакции

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

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

Транзакции являются методами объекта

ADOConnection.

Метод Описание
BeginTrans С вызова данного метода начинается выполнение транзакции.
CommitTrans Завершает последовательность процессов и в случае отсутствия ошибок сохраняет внесенные изменения в базе данных.,
RollbackTrans В случае появления ошибки отменяет процесс и возвращает базу данных в состояние, в котором она была до выполнения команды BeginTrans.

 

В листинге 1 приводится пример использования транзакции.

Листинг 1 Использование транзакции в VBA:

Function TestTrans() As Boolean

Dim conn As ADODB.Connection

Dim rst As ADODB.Recordset

On error resume Err_TestTrans

Set conn = New ADODB.Connection

Conn.BeginTrans

'выполнениепроцессов, подобныхоператорам SQL, либометодов.Edit,

'.Update,.AddNew Methods

' В случае отсутствия ошибок изменения сохраняются.

Conn.CoimnitTrans

Exit Function

Err_TestTrans:

'В случае возникновения ошибок выполняется откат транзакции.

Conn.RollbackTrans

………………………..

EndFunction

Транзакции могут быть вложенными, когда сохранение результата одной транзакции зависит от кор­ректности выполнения другой. В случаях вложения транзакций необходимо проверять корректность их вы­полнения, начиная с низшего (внутреннего) и заканчивая наивысшим (внешним) уровнем.

Блокировка Oracle/SQL Server

При работе с Oracle, SQL Server, Informix или любым другим серверным механизмом баз данных Access более не осуществляет управление блокировкой. Однако основная концепция остается неизменной - Access управляет доступом к записям в базе данных, обеспечивая многим пользователям одновременный доступ к ней.

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

При использовании Microsoft SQL Server могут применяться следующие типы блокировок:

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

• Exclusive Lock (Монопольная блокировка). Такая блокировка используется при выполнении по от­ношению к данным операторов SQL UPDATE, DELETE или INSERT. При этом на монопольно бло­кированные данные не могут налагаться никакие другие блокировки до тех пор, пока SQL Server не снимет монопольную блокировку.

• Live Lock (Временная блокировка). Подобная блокировка является запросом на монопольную бло­кировку, возникающим после четырех последовательных неудачных попыток применения монополь­ной блокировки данных. Такая блокировка возникает в случаях наличия слишком большого количества перекрывающихся общих блокировок. В подобной ситуации SQL Server перестает при­менять общие блокировки. Временные блокировки предотвращают монополизацию таблицы или страницы общими блокировками (при операциях считывания) и запрещают операции, связанные с записью (UPDATE, DELETE, INSERT). Они также предотвращают ситуацию, называемую "на­сыщением блокировки".

Существуют и другие используемые SQL Server стратегии обработки проблем одновременного досту­па. К ним относятся динамическая блокировка на уровне строки (SQL Server 7.0), предотвращение, выявление и исправление взаимной блокировки, управление оптимистической блокировкой, а также наращивание масштабируемых блокировок.

Динамическая блокировка данных на уровне строки соответствующим диспетчером SQL Server дина­мически настраивает конфигурацию сервера блокировок, исходя из размера и характеристик использова­ния базы данных. Это в значительной степени уменьшает необходимость в ручной настройке и поддержке сервера блокировки.

При предотвращении, выявлении и исправлении взаимной блокировки SQL Server выявляет момент возникновения конфликта двух транзакций. В подобной ситуации выясняется, что одна транзакция моно­польно блокировала данные, требуемые другой транзакцией, а та, в свою очередь, монопольно блоки­ровала данные, требуемые первой. Обе транзакции не могут снять свои блокировки. Без вмешательства механизма баз данных они остаются в состоянии взаимной блокировки, для снятия которой SQL Server осуществляет откат одной транзакции, завершает другую и снова запускает первую.

SQL Server активно предотвращает взаимные блокировки, значительно уменьшая количество блоки­ровок в таблицах.

Для обеспечения работы многих пользователей SQL Server использует подход оптимистического управ­ления одновременным доступом. При оптимистическом подходе для просмотра данных пользователи мо­гут применять курсор со стороны сервера, не вызывая их блокировки. Вместо этого SQL Server выявляет изменения возвращаемых строк и затем действует соответствующим образом (обычно отклоняя изменение, если только оно не сопровождается явной инструкцией блокировки). Такой подход увеличивает объем доступных данных без интенсивного управления блокировкой и вызываемой этим перегрузки.

Резюме

В данной главе исследовались вопросы работы в многопользовательской среде, начиная с конфигури­рования файла базы данных и заканчивая выбором наборов записей и работой со страницами и записями данных. Подробно рассматривались различные стратегии блокировки, сравнивались методы оптимистической и пессимистической блокировки, описывались преимущества новых возможностей механизма баз данных Jet при блокировке на уровне строки. Приводились аргументы выбора применяемых приложением типов блокировки, а также давались советы по использованию сообщений об ошибках, поступающих от постав­щика OLEDB. В целом эта глава призвана помочь в выработке эффективной стратегии и тактики при создании нового приложения, она может также оказаться полезной и при отладке существующей базы данных.

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

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: