Блокировка на уровне страницы в Jet 4.0 вставить? Ошибка "Не удается обновить; в данный момент заблокировано"

Я получаю эту ошибку периодически перед вставкой записи в подчиненную форму.

Подчиненная форма находится в режиме "непрерывных записей". Источник записей подчиненной формы - это запрос параметра, открытый через querydef.OpenRecordset в режиме dbOpenDynaset.

Используя MS Access 2003, формат файла Access 2000 для внешнего интерфейса и внутреннего интерфейса, для FE и BE выбрана блокировка на уровне записи, все формы имеют "No Locks" для RecordLocks.

Погуглив, похоже, что у многих людей были похожие ситуации, но решений не найдено.

Есть идеи? Кажется, что блокировка на уровне страницы используется вместо уровня записи, когда вставка выполняется в форме.

  1. Может ли быть так, что внутреннее соединение (через DAO OpenDatabase) возвращается к блокировке на уровне страницы? Любая настройка в строке подключения DAO, которая может быть полезна, если так?

  2. Может ли быть так, что, открывая набор записей через querydef, он использует блокировку на уровне страницы, так что одновременное обновление записи и вставка записи (recordset.AddNew или что-то еще) могут конфликтовать? Статья Microsoft предполагает, что это может иметь место (хотя неясно, так как OpenRecordset должен быть в порядке):

Однако любые запросы языка управления данными SQL (DML), то есть запросы, которые добавляют, удаляют или изменяют записи, выполняются из ADO (при использовании поставщика OLE DB для Microsoft Jet 4.0), DAO или пользователя запроса Access. Интерфейс будет использовать блокировку на уровне страницы. Блокировка на уровне страницы используется для операторов SQL DML для повышения производительности при работе со многими записями. Однако даже когда блокировка на уровне записи включена, она не используется для обновления значений в памятных полях и значений в индексированных полях - для них по-прежнему требуется блокировка на уровне страниц.

1 ответ

Это то, что, по-моему, является источником моей проблемы, и, возможно, поэтому Аарон сказал, что Jet "случайным образом блокирует записи". Из документов DAO:

Recordset.AddNew Метод

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

Я думаю, что я вижу это больше в этом проекте, потому что он включает в себя частую вставку большого количества записей, когда пользователь открывает форму, поэтому движок БД создает много новых страниц, поэтому AddNew - как вызывается во время события Insert в Форма - имеет больше шансов вернуться к пессимистической блокировке, поэтому больше шансов для конфликтов с другими записями, редактируемыми одновременно на той же странице.

Я установлю испытательный стенд, чтобы проверить, верны ли мои подозрения.

Если так, то кажется, что вы могли бы избежать этого, не используя AddNew (AllowAdditions = False) и вместо этого вставьте новые записи с помощью запроса + обновите набор записей формы. Даже если запрос вставки вызывает новую страницу, с querydef.Execute вы не открываете набор записей, поэтому теоретически не должно быть проблем с блокировкой.

Другие вопросы по тегам