Учебная работа. Реферат: База данных Access. Особенности работы в многопользовательском режиме
Access. Индивидуальности работы в многопользовательском режиме
Опосля сотворения приложения Access оно покидает среду разработки и направляется для использования заказчиками. При всем этом могут появиться трудности, связанные с работой этого приложения в многопользовательской среде. Более суровой из этих заморочек является разрешение конфликтов, возникающих при одновременном воззвании нескольких юзеров к записям базы данных Access
Конфликты доступа
Принципиально держать в голове, что работа с базой данных в многопользовательской среде может вызывать проблемы, связанные с блокировкой данных и конфликтами доступа к ним. Угнетение сообщений о ошибках, недостающее внимание к схожим вопросцам или надежда на подходящее стечение событий не решает делему. Невзирая на кажущуюся сложность работы в многопользовательской среде, осознать механизм деяния блокировки данных и метод обслуживания механизмом Jet нескольких юзеров довольно просто. Пренебрежение схожими вопросцами, как правило, приводит к появлению более сложных заморочек, затрагивающих юзеров, клиентов и влияющих на репутацию разраба. Если для приложения не предвидено действенное решение вопросцев работы в многопользовательской среде, при работе с ним безизбежно будут возникать последующие трудности:
• Новейшие записи не сохраняются. Опосля ввода инфы юзер обнаруживает, что в базе данных она не возникла. Если схожая ошибка не повторяется, это гласит не о отсутствии трудности, а о ненадежности приложения.
• конфигурации имеющихся записей не сохраняются. юзер может даже не увидеть, что внесенные им конфигурации не сохранились. Но в предстоящем может оказаться, что или таблица итоговых данных отсутствует, или в инвентарном перечне очень много частей, либо может случиться так, что заказ принципиального клиента будет выслан по неправильному адресу. Подобные серьезные трудности полностью могут оказаться не выявленными впору. Как правило, от их мучаются посторонние люди.
• Юзеры получают безрассудные сообщения о невозможности обеспечить доступ к данным. Хотя последствия подобного рода проблем не настолько драматичны, как в прошлых вариантах, для юзера будет мощным разочарованием необходимость работы с приложением, которое не может совладать даже с таковой легкой неувязкой.
Трудности работы приложений Access в многопользовательской среде соединены не только лишь с установкой и снятием блокировок записей. Так как такое приложение существует в виде одного файла и, по крайней мере, часть его форм быть может конкретно связана с данными, хоть какой обзор заморочек применения в многопользовательском режиме должен обхватывать вопросцы работы на уровне файла, нюансы конфигурирования, также технологий разработки интерфейсов и параметров запросов и форм. Обычное приложение Access просит определенного сочетания разных приемов работы в распределенном режиме, так как в различных частях приложения подобные трудности решаются разными методами.
Конфигурация
Для обслуживания нескольких юзеров приложение Access нужно на файловом уровне конфигурировать по-разному. Любой метод имеет свои достоинства и недочеты, некие из их перечисляются ниже.
• Сетевое размещение. В данной конфигурации единый MDB-файл размещается на сетевом сервере, и юзеры получают доступ к базе данных при воззвании к серверу. Данные и выполняемые модули могут содержаться в едином MDB-файле или располагаться на файловом сервере в виде нескольких отдельных файлов. Преимуществом данной конфигурации является простота поддержки, так как по мере необходимости в обновлении нуждается только выполняемый файл. Но, так как все формы, отчеты, модули, запросы, ЕХЕ-файлы Access, также все библиотеки DLL и т.п. должны передаваться по сети на рабочую станцию, сетевой трафик необоснованно растет, а производительность существенно понижается. возможно, в схожих конфигурациях следует использовать связанные формы. Дальше рассматриваются трудности связывания форм с данными и возникающие при всем этом конфликты доступа.
• Разбитая база данных с размещенными в сети данными. Таковая конфигурация по традиции называется конфигурацией удаленной базы данных (отметим, что клиент-сервер, механизм баз данных Access на пользовательском ПК получает, обрабатывает, перекрывает и снимает блокировку с данных, находящихся в MDB-файле на сетевом сервере. Работа в таковой конфигурации зависит от устройств баз данных сразу работающих юзеров, также от способностей файлового сервера, касающихся поддержания сетевого графика. До реального времени при размещении приложений баз данных Access предпочтение отдают конкретно этому способу. Его преимуществом является высокая производительность и маневренность при корректном использовании. Так как при размещении данных в сети по каналам связи передаются лишь они, сетевой трафик существенно понижается. Главный недочет данной конфигурации состоит в том, что на любом клиентском ПК нужно устанавливать Access и выполняемый MDE- (скомпилированный вариант базы данных MDB) или MDB-файл, что осложняет поддержку приложения. Тем не наименее, есть способы решения схожей трудности.
• Репликация. При использовании схемы репликации юзеры вместе обрабатывают данные, хотя данные по сути не являются общими, как это имеет пространство в схемах сетевого распределения либо в разбитых базах данных. В схеме репликации любой юзер либо маленькая группа юзеров имеет свою копию данных, которые средством механизма репликации Jet синхронизируются с иной базой либо базами данных. Одно из преимуществ таковой схемы, когда любому юзеру предоставляется копия данных, состоит в полном исключении трудности блокировки, но заместо их появляются трудности репликации, степень трудности которых является фактически таковой же. Остальным значимым преимуществом репликации является возможность асинхронного доступа к данным для отключенных от сети юзеров. совместно с тем существует очередной недочет таковой схемы: при совместном использовании источника данных даже маленький группой юзеров все таки существует возможность появления как конфликтов доступа, так и заморочек репликации.
• Конфигурация клиент-сервер. В Access 2000 возникла новенькая возможность сотворения клиент-серверных приложений на базе проекта Microsoft Access. В таковой конфигурации удаленными являются как данные, так и механизм баз данных. Если данными управляет SQL Server, Oracle либо какой-нибудь другой баз данных, расположенный на центральном компе, он также решает вопросцы блокировки и трудности работы в многопользовательской среде. Это не значит, что разраб избавлен от необходимости решения всех связанных с ними задач, просто ему приходится иметь дело с другими наборами параметров, способностей и правил. Главными преимуществами таковой конфигурации являются высочайшая производительность, стабильность, возможность обслуживания огромного количества юзеров и выполнения огромного количества задач. Больший недочет данной конфигурации состоит в высочайшей цены и значимой трудности.
В данной главе рассматриваются вопросцы, которые являются общими для сетевых конфигураций: схемы разбитой базы данных и реализации архитектуры клиент-сервер. О репликации рассказывается в главе 22.
При использовании Access существует ряд установок на уровне базы данных (для форм, запросов, наборов записей) и на уровне выполняемого кода, которые требуют обоюдного координирования в целях обеспечения надежного обслуживания приложением нескольких юзеров. В разных частях приложения представлены практически все обсуждаемые в главе темы. Как для различных приложений, так и в границах одной программки может быть применение различных технологий, также их композиций. Основой организации работы в многопользовательской среде является планирование, прогнозирование и тестирование.
Access и методы блокировки в Jet
Механизм Jet имеет схему блокировки, которая дозволяет отлично обслуживать несколько пользователей. При использовании Jet с Access, а не с VB либо любым другим инвентарем разработки нужно учесть, что некие деяния производятся по дефлоту. Данный раздел посвящен исследованию этих вопросцев.
Главные сведения о блокировке
Перед внедрением приложения многопользовательской базы данных его следует расположить таковым образом, чтоб юзеры имели к нему доступ, также настроить для совместного использования. Существует несколько методов заслуги данной нам цели.
В диалоговом окне Options (характеристики), отображающемся при выполнении установок меню Tools Options (Сервис / характеристики), во вкладке Advanced (Остальные) имеется параметр Default open mode (Режим открытия, определенный по дефлоту). тут можно найти режим открытия базы данных, т.е. обязана ли она раскрываться для монопольного доступа (лишь для 1-го юзера на весь сеанс работы) либо для общего доступа.
Если избран режим Exclusive (монопольный доступ), базу данных имеет Право открывать лишь один юзер. В этом случае Access изменяет заголовок LDB-файла, тем заблокируя его (подробнее о этом см. в разделе «LDB-файл«) и запрещая доступ к данным для всех остальных юзеров. Очевидно, для многопользовательского приложения таковая настройка употребляться не обязана. Но такие процедуры, как сжатие и восстановление, следует делать над базой данных, открытой для монопольного доступа.
Режим Shared (Общий доступ) дозволяет открывать базу данных нескольким юзерам одновременно. При всем этом Access в момент открытия базы данных вносит информацию о подключившихся к ней юзерах в LDB-файл и использует механизм блокировки и освобождения страничек и строк.
Эти и остальные характеристики можно задавать в командной строке во время пуска приложения Access. Некие из их перечислены в табл. 1.
Таблица 1 характеристики командной строчки при запуске Access
Параметр
Описание
/Excl
база данных раскрывается для монопольного доступа. Данный параметр можно употреблять даже тогда, когда для базы данных установлен режим Shared.
/Ro
Лишь для чтения. Хотя база данных доступна для нескольких юзеров, в нее нереально заносить конфигурации, при всем этом блокировка не употребляется.
Отсутствует
Режим, определенный по дефлоту. Отсутствие параметра /Excl либо /Ro дозволяет открывать базу данных в режиме общего доступа или в согласовании с определенным для нее режимом.
СОВЕТ
По мере необходимости совместного использования принципиально предупредить открытие базы данных в монопольном режиме. Этого можно достигнуть, отключив параметр OpenExclusive при определении опций для рабочих групп и задании характеристик защиты данных в приложении. Наиболее тщательно эта тема рассматривается в иной статье.
Задавая характеристики базы данных, разраб может выбирать режим блокировки записи по умолчанию: блокировку на уровне строчки или на уровне странички.
Сопоставление блокировки на уровне странички с блокировкой на уровне строчки
В прошедшем Access были присущи недочеты, связанные с возникновением конфликтов доступа при использовании неидеального метода хранения и блокировки записей. Так как Access поддерживает переменную длину записей, обычная реализация блокировки на уровне строчки была затруднена. Обеспечивая достоинства таковой структуры записей, Access был обязан хранить записи в статической страничной структуре объемом 2 Кб (при использовании механизма баз данных Jet 4.0 для приложения Access 2000 размер странички данных составляет 4 Кб). При предумышленной или случайной блокировке записи блокировалась вся страничка, что приводит к недоступности всех ее записей. Невзирая на эффективность такового способа, его применение приводит к появлению разных заморочек, связанных с конфликтами доступа, также уменьшает число сразу работающих юзеров приложения Access. Таковым образом, при использовании Access способности разраба были ограниченны.
В Access 2000 механизм баз данных Jet 4.0 дозволяет разрабам выбирать способ блокировки по дефлоту: на уровне строчки или на уровне странички. сейчас юзер может перекрыть лишь редактируемую запись, а не все записи на страничке. Так как отдельная запись может блокироваться только на куцее время (к примеру, при выполнении операторов SQL Delete, Update либо Insert), возможность конфликта 2-ух юзеров во время ее редактирования ниже, чем при одновременной блокировке нескольких записей в схеме страничной блокировки. Ранее возможность конфликта множилась на число записей на страничке, определение которого было затруднено. количество записей на страничке данных зависело от размера записей и от времени их ввода, потому предугадать возможность конфликта было проблемно.
Режим блокировки на уровне строчки определен по дефлоту, но это не значит, что он во всех вариантах является хорошим. Если главной задачей ставится производительность приложения, а конфликты появляются довольно изредка или поддаются контролю, таковой метод блокировки может привести к понижению производительности. Разглядим пример компьютерной системы банка, осуществляющего международные торговые операции, в какой ввод записей делается еще почаще, чем их редактирование. Так как для схожей системы очень принципиальна высочайшая производительность, а ее понижение допускается только в случае конфликта, другие операции базы данных должны производиться с очень вероятной скоростью. В схожем случае может употребляться страничная блокировка.
С иной стороны, если к базе данных должен обеспечиваться доступ почти всех юзеров, а одновременное редактирование каждым юзером наиболее одной записи неприемлимо, может быть применение блокировки на уровне строчки. Это тем наиболее правильно при активном редактировании базы данных. Ворачиваясь например банковской системы, необходимо подчеркнуть, что записи базы данных с информацией о депозитах и изъятиях со счетов клиентов должны быть вседоступны. При редактировании записи ее следует перекрыть, в неприятном случае существует риск, что внесенные юзером конфигурации будут перезаписаны конкурирующим юзером. Наиболее того, редактирование одной записи не обязано препятствовать редактированию примыкающей записи остальным юзером. Блокировка на уровне строчки может применяться в ситуациях, когда запись обязана оставаться открытой некое время, в течение которого ее не могут редактировать остальные юзеры. Примером может служить просмотр инфы о клиенте для подведения баланса или оценки его кредитоспособности. До окончания просмотра и принятия решения изменять запись не нужно. Если запись остается открытой в течение нескольких минут, лучше избегать блокировки нескольких остальных записей на время ее редактирования. Обычно, следует избегать даже одной записи в течение довольно долгого периода времени, если лишь это не является полностью нужным.
Таковым образом, создатели имеют возможность управлять доступом почти всех юзеров на уровнях странички или строчки данных, что присваивает приложениям достаточную упругость.
LDB-файл
Файл блокировки — это особый временный файл, создаваемый при открытии базы данных Access. Он содержит информацию о используемых в базе данных блокировках, также о ее юзерах. При закрытии базы данных файл удаляется. Его имя совпадает с именованием соответственной базы данных, но он имеет расширение LDB. Этот файл постоянно размещается в том же каталоге, что и база данных.
Сопоставление жизнеутверждающей, пессимистической блокировок и блокировки на уровне строчки
Разраб может справедливо полагать, что в многопользовательском приложении рано либо поздно возникнет конфликт доступа при воззвании к одной и той же записи. Единственное разумное решение таковой трудности заключается в выборе соответственных характеристик блокировки. Существует два варианта блокировки: жизнеутверждающая и пессимистическая.
Жизнеутверждающая блокировка
Жизнеутверждающая блокировка употребляется в Access по дефлоту, она ординарна в реализации, и обычно предпочтение отдают конкретно ей. При жизнеутверждающей блокировке записи предполагается, что конфликты доступа маловероятны и что запись блокируется только в момент ее фактического обновления. Это обеспечивает высшую степень доступности данных, так как Право длительного или толького доступа к ним никому не предоставляется. В согласовании с вышесказанным при открытии записи для редактирования другие юзеры также могут открывать ее для редактирования, при этом преимущество сохранения внесенных конфигураций имеет 1-ый юзер. Хотя жизнеутверждающая блокировка ординарна в реализации и обычно не порождает заморочек доступа юзеров к своим данным, но при ее использовании одним из более принципиальных вопросцев работы с базами данных в многопользовательской среде является вопросец о том, чьи конфигурации следует сохранять. Когда юзер А
открывает запись для редактирования и накладывает на нее жизнеутверждающую блокировку, ничто не мешает юзеру Б
открыть эту же запись для внесения конфигураций. Если Б
сохранит конфигурации ранее, чем это сделает А,
юзер А
получит последующее сообщение:
«The Microsoft Jet database engine stopped the process because you and another User are attempting to change the same data at the same time.»
(«Механизм баз данных MicrosoftJet приостановил процесс, так как вы и иной юзер сразу предприняли попытку доступа к этим же данным».)
В схожей ситуации предыдущие версии Access показывали маловразумительное диалоговое окно, предлагающее юзеру избрать один из вариантов: сохранить свои конфигурации, не сохранять их или скопировать информацию в буфер обмена. Такое диалоговое окно конфликта доступа при сохранении изменений просто не предоставляло довольно инфы для того, чтоб создать разумный выбор. Новое диалоговое окно конфликта доступа при сохранении конфигураций не предоставляет способности выбора и является конкретным. Дальше рассматриваются некие методы лучшей обработки ошибок при появлении схожей ситуации.
Пессимистическая блокировка
Пессимистическая блокировка является противоположностью жизнеутверждающей. При пессимистической блокировке записи либо странички она становится труднодоступной для остальных юзеров с момента начала редактирования записи до момента ее сохранения. Таковой метод блокировки употребляется почти всеми иными базами данных, потому он знаком большинству разрабов, а его результаты не должны вызывать вопросцев у юзеров. Хотя пессимистическая блокировка исключает присущие оптимистической блокировке конфликты доступа при записи конфигураций, она также не лишена недочетов.
При использовании пессимистической блокировки возможность конфликтов при воззвании к данным быть может уменьшена. Когда употребляется блокировка на уровне странички, возникает доборная неувязка, сплетенная с блокировкой всех записей на страничке в течение определенного периода времени. Если обычно процесс редактирования оказывается довольно долгим и существует много конкурирующих юзеров, пессимистическую блокировку следует использовать с осторожностью. В неких приложениях, к примеру баз данных для хранения инфы о продажах и товарах, возможно, предпочтение следует отдавать пессимистической блокировке, так как главные операции соединены с обработкой имеющихся записей. В то же время для систем отслеживания конфигураций данных во времени пессимистическая блокировка плохо отражается на производительности. Большая часть касающихся пессимистической блокировки предупреждений и оговорок относятся к способу страничной блокировки в Access. сейчас, когда в Access имеется возможность делать блокировку на уровне строчки, пессимистическая блокировка обязана получить наиболее обширное распространение и применение.
Блокировка на уровне строчки
Главным преимуществом блокировки на уровне строчки является расширение доступа к базе данных для почти всех юзеров. При блокировке единственной редактируемой записи почти всем юзерам предоставляется доступ к большему размеру данных без появления конфликтов блокировки либо доступа к записям. Внедрение блокировки на уровне строчки также дозволяет разрабам расширить границы использования пессимистической блокировки. Таковым образом, юзерам предоставляются более знакомые и тривиальные условия работы, в процессе которой они делают легкие операции открытия записи, ее редактирования и сохранения конфигураций. В предыдущих версиях 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 приостановил процесс вследствие одновременной пробы 2-ух юзеров поменять одни и те же данные.)
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.
Таблица 5 Сочетания параметров NativeError и Number объекта Connection. Errors для идентификации типа блокировки
юзер
Свойство
Значение
Тип блокировки
Данный юзер
Connection.Errors(0).NativeError
-533791822
Пессимистическая
Данный юзер
Connection.Errors(O).Number
-105514571
Жизнеутверждающая
Иной юзер
Connection.Errors(O).NativeEr
-2147467259
Пессимистическая
Иной юзер
Connection.Errors(O).Number
-2147217887
Жизнеутверждающая
На данном шаге смысл этих значений не совершенно очевиден, разве что их можно употреблять при выбирании момента для еще одной пробы обновления данных. Но настоящую ситуацию, когда они могут пригодиться, предугадать тяжело. Пока будем считать их применение делом грядущего.
Внедрение блокировки страничек
Как уже говорилось, в течение долгого периода в 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 поспешно создаются людьми, которые не постоянно довольно отлично разбираются в вопросцах многопользовательского внедрения. По последней мере, таковая обработка конфликта записи является решительной и конечной, а юзерам не придется находить ответ на вопросец, над которым они никогда не думали. Если приложение обязано обрабатывать конфликт записи другим методом, нужно сделать пользовательскую функцию обработки ошибки.
Блокированная запись
Когда в процессе обыденного использования приложения юзер А пробует поменять запись, редактируемую юзером Б, 1-ый из их получит сообщение о ошибке 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 (Временная блокировка). Схожая блокировка является запросом на монопольную блокировку, возникающим опосля 4 поочередных неудачных попыток внедрения монопольной блокировки данных. Таковая блокировка возникает в вариантах наличия очень огромного количества перекрывающихся общих блокировок. В схожей ситуации SQL Server перестает припоменять общие блокировки. Временные блокировки предупреждают монополизацию таблицы либо странички общими блокировками (при операциях считывания) и воспрещают операции, связанные с записью (UPDATE, DELETE, INSERT).
Они также предупреждают ситуацию, именуемую «насыщением блокировки».
Есть и остальные применяемые SQL Server стратегии обработки заморочек одновременного доступа. К ним относятся динамическая блокировка на уровне строчки (SQL Server 7.0), предотвращение, выявление и исправление обоюдной блокировки, управление жизнеутверждающей блокировкой, также наращивание масштабируемых блокировок.
Динамическая блокировка данных на уровне строчки подходящим диспетчером SQL Server динамически настраивает конфигурацию сервера блокировок, исходя из размера и черт использования базы данных. Это в значимой степени уменьшает необходимость в ручной настройке и поддержке сервера блокировки.
При предотвращении, выявлении и исправлении обоюдной блокировки SQL Server выявляет момент появления конфликта 2-ух транзакций. В схожей ситуации выясняется, что одна транзакция монопольно перекрыла данные, требуемые иной транзакцией, а та, в свою очередь, монопольно блокировала данные, требуемые первой. Обе транзакции не могут снять свои блокировки. Без вмешательства механизма баз данных они остаются в состоянии обоюдной блокировки, для снятия которой SQL Server производит откат одной транзакции, завершает другую и опять запускает первую.
SQL Server интенсивно предутверждает обоюдные блокировки, существенно понижая количество блокировок в таблицах.
Для обеспечения работы почти всех юзеров SQL Server употребляет подход жизнеутверждающего управления одновременным доступом. При жизнеутверждающем подходе для просмотра данных юзеры могут использовать курсор со стороны сервера, не вызывая их блокировки. Заместо этого SQL Server выявляет конфигурации возвращаемых строк и потом действует подходящим образом (обычно отклоняя изменение, если лишь оно не сопровождается очевидной аннотацией блокировки). Таковой подход наращивает размер доступных данных без интенсивного управления блокировкой и вызываемой сиим перегрузки.
Резюме
В данной главе исследовались вопросцы работы в многопользовательской среде, начиная с конфигурирования файла базы данных и заканчивая выбором наборов записей и работой со страничками и записями данных. Тщательно рассматривались разные стратегии блокировки, сравнивались способы жизнеутверждающей и пессимистической блокировки, описывались достоинства новейших способностей механизма баз данных Jet при блокировке на уровне строчки. Приводились аргументы выбора используемых приложением типов блокировки, также давались советы по использованию сообщений о ошибках, поступающих от поставщика OLEDB. В целом эта глава призвана посодействовать в выработке действенной стратегии и стратегии при разработке новейшего приложения, она может также оказаться полезной и при отладке имеющейся базы данных.
Приведенная информация носит обзорный нрав. Основную же Ценность представляет опыт практической разработки приложений для работы в многопользовательской среде. При всем этом следует уделять особенное внимание разрешению конфликтов доступа, которые неизбежно появляются в настоящей ситуации. Но в Access имеются особые средства для решения схожих заморочек.
]]>