Блокировка на уровне страницы в Jet 4.0 вставить? Ошибка «Не удается обновить; в данный момент заблокировано» - PullRequest
2 голосов
/ 22 февраля 2011

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

Подчиненная форма находится в режиме «непрерывных записей».Источник записей подчиненной формы - это запрос параметра, открытый через 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 Ответ

0 голосов
/ 19 апреля 2011

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

Recordset.AddNew Method

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

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

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

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

...