Поделиться через


Монопольная блокировка требуется для сохранения изменений структуры в объектах Access

Исходный номер базы знаний: 283228

Примечание.

Дополнительно: требуются экспертные навыки программирования, взаимодействия и многопользовательских навыков. Эта статья относится только к базе данных Microsoft Access (.mdb и ACCDB).

Симптомы

При попытке настроить панели инструментов или открыть форму, отчет, макрос или модуль Microsoft Access в режиме конструктора появляется следующее сообщение:

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

При попытке сохранить изменения структуры, внесенные в форму Access, отчет, макрос или модуль, появляется следующее сообщение:

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

При попытке сохранить новую страницу доступа к данным появляется следующее сообщение:

Не удалось создать ссылку на эту страницу доступа к данным, так как база данных не может быть заблокирована исключительно.

Причина

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

Чтобы сохранить изменения структуры этих типов объектов, Access должен иметь возможность получить монопольную блокировку базы данных.

Решение

В ситуациях, когда несколько разработчиков одновременно разрабатывают приложение Access, необходимо реализовать управление исходным кодом с помощью надстройки Microsoft Visual SourceSafe для Microsoft Access. Кроме того, необходимо распространить локальные рабочие копии базы данных каждому разработчику. Ниже приведено обсуждение каждого из этих вариантов.

Реализация системы управления исходным кодом

Надстройка Microsoft Access Visual SourceSafe позволяет поместить приложение Access в систему управления исходным кодом во время разработки. Если поместить приложение в систему управления исходным кодом, это позволит отслеживать и хранить изменения, внесенные в приложение с течением времени. С помощью Microsoft Visual SourceSafe можно просмотреть журнал объекта, а затем вернуться к более ранним версиям объекта. Вы можете извлечь объекты в приложении Microsoft Access, изменить их или создать новые объекты в локальной копии, а затем вернуть их обратно в основную базу данных в системе управления исходным кодом. Надстройка Microsoft Access Visual SourceSafe доступна в Microsoft Office XP Developer. Чтобы использовать надстройку Microsoft Access Visual SourceSafe, необходимо также установить Microsoft Visual SourceSafe, которая также доступна в Microsoft Office XP Developer отдельно.

Использование отдельных рабочих баз данных

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

Одним из недостатков использования этого подхода является отсутствие способа определить, работают ли несколько разработчиков одновременно с одним и тем же объектом локально. Когда разработчик экспортирует объект в базу данных master, он может неосознанно перезаписать изменения, внесенные другим разработчиком в базу данных master.

Дополнительная информация

Чтобы сохранить изменения структуры в объектах Access, таких как формы, отчеты, ссылки на новые страницы, макросы, модули и панели команд, Access 2002 должен иметь возможность блокировать базу данных исключительно во время операции сохранения . Таблицы, запросы и связи не попадают под это ограничение, так как они являются объектами Microsoft Jet. Корпорация Майкрософт использует это требование в Access 2002 по нескольким причинам:

  • Он обеспечивает согласованность с другими клиентскими приложениями среды Visual Basic.
  • Она останавливает зависимость от ядра СУБД Jet.
  • Это повышает стабильность объектов, относящихся к Доступу.

Обеспечивает согласованность с другими клиентскими приложениями среды Visual Basic

Так как в Access 2002 размещается среда Visual Basic, модель сохранения, используемая Microsoft Access, должна соответствовать другим приложениям, в которых размещена среда Visual Basic. Среда Visual Basic разрешает исключительное редактирование и сохранение проектов Visual Basic, которые не находятся под управлением исходного кода. Это относится к Visual Basic 6.0, а также ко всем приложениям Office, в которых размещена среда Visual Basic.

Останавливает зависимость от ядра СУБД Jet

Access предоставляет возможность создавать файлы проектов Microsoft Access (ADP), а также базы данных Microsoft Access (.mdb). С помощью проекта Access разработчики могут использовать Microsoft SQL Server в качестве другого ядра СУБД в Microsoft Jet. В прошлом все объекты Access (формы, отчеты, макросы, модули и панели команд) зависели от ядра СУБД Jet для хранения. Эти объекты хранились в системных таблицах, относящихся к Access, в базе данных Microsoft Jet. Поскольку Access может использовать Microsoft SQL Server в качестве альтернативы Microsoft Jet, корпорации Майкрософт пришлось разработать механизм хранения для объектов Access, которые не зависят от ядра СУБД Jet.

Повышает стабильность объектов, относящихся к доступу

Модель хранения проекта повышает стабильность объектов Access и проекта Visual Basic. Visual Basic для приложений никогда не разрешал многопользовательское редактирование проектов Visual Basic без управления исходным кодом. Microsoft Access 95 и Microsoft Access 97 могут обойти это ограничение, скрывая изменения проекта, внесенные в многопользовательской среде, из Visual Basic для приложений, а затем объединяя их с проектом позже. Однако это может повлиять на стабильность проекта Visual Basic. Таким образом, microsoft Access требует монопольную блокировку при разработке объектов Access, чтобы убедиться, что в проекте есть только один редактор.

Изменение объектов Access в многопользовательской среде

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

Если разработчик открывает базу данных для монопольного использования, он может сохранить структуру любого объекта Access при условии, что он может открыть базу данных для доступа на чтение и запись и имеет правильные разрешения на изменение структуры объекта.

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

Продвижение блокировки

Чтобы обеспечить монопольное использование базы данных, Access использует функцию управления подключением ядра СУБД Jet для повышения уровня общей блокировки пользователя до монопольной. Access пытается повысить уровень общей блокировки до монопольной, как только пользователь открывает форму, отчет, макрос или панель команд в режиме конструктора. В настоящее время Access пытается увеличить блокировку, чтобы предотвратить сценарий, в котором пользователь внес несколько изменений в структуру, чтобы позже обнаружить, что пользователь не может сохранить их, так как Access не может получить монопольную блокировку. При попытке повышения уровня блокировки, как только пользователь открывает объект в режиме конструктора, Access может предупредить пользователя, если ему не удается получить монопольную блокировку, прежде чем пользователь вносит какие-либо изменения в дизайн. Access не будет пытаться заблокировать повышение при открытии модуля в режиме конструктора; однако он будет пытаться заблокировать повышение, как только пользователь изменит любой модуль в базе данных.

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

Если Access не может повысить уровень блокировки до монопольной, когда пользователь открывает объект в режиме конструктора, Access оповещает пользователя с сообщением:

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

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

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

Если пользователь пытается закрыть грязный объект и сохранить изменения, Access предложит пользователю закрыть объект и отменить внесенные в него изменения макета или оставить его открытым и несохранимым.

Действия по воспроизведению поведения

  1. Запустите два экземпляра Microsoft Access на одном компьютере.

  2. Откройте пример Northwind.mdb базы данных в обоих экземплярах.

  3. В первом экземпляре Microsoft Access откройте форму Клиенты в режиме конструктора .

    Вы получите сообщение:

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

  4. Нажмите кнопку ОК , чтобы очистить сообщение.

    Форма откроется в режиме конструктора .

  5. Добавьте в форму элемент управления "Текстовое поле".

  6. В меню Файл выберите пункт Сохранить.

    Вы получите следующее сообщение:

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

  7. Нажмите кнопку ОК , чтобы очистить сообщение.

  8. Закройте второй экземпляр Access на компьютере.

  9. В первом экземпляре Access попробуйте сохранить форму еще раз.

    Форма успешно сохранена.