Как записи хранятся на странице MS Access?Может ли запись храниться на двух страницах? - PullRequest
2 голосов
/ 14 марта 2011

У меня есть два приложения VC ++ 6, которые записывают / обновляют данные в общей базе данных Access 2000 - оба приложения загружают информацию из разных регистраторов данных.

Время от времени мы получаем исключение при попытке добавить / редактировать / обновить:

(3260) Не удалось обновить; В настоящее время заблокирован пользователем 'admin' на машине 'ABC123'.

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

Мы используем CDaoRecordset для доступа к данным. Из чтения документов видно, что по умолчанию используется оптимистическая блокировка страницы базы данных, в которой находится запись. Если другой процесс пытается отредактировать / обновить запись на той же странице, он получает ошибку, которую мы видим.

Переход к SQL Server на данном этапе не вариант - это не простое изменение из-за структуры вещей.

Мне интересно, смогу ли я сделать записи в затронутых таблицах достаточно большими, чтобы в каждую страницу данных 2k помещалась только одна запись. Если я сделаю каждую запись длиной 1100 байт, то каждая запись должна получить свою страницу, решая проблему блокировки. Я знаю, что он будет занимать больше дискового пространства, однако на данный момент это не проблема, поскольку затронутые таблицы имеют довольно малый объем.

Это сработает? Можно ли разделить запись в Access 2000 на две страницы?

Ответы [ 3 ]

1 голос
/ 14 марта 2011

Раздувание записей, чтобы избежать конфликта блокировок, не очень практичный метод. Во-первых, доступ к базам данных ограничен до 2 Гб. Это включает в себя системные таблицы. Я предлагаю вам перехватить ошибку и попробовать снова. Не зная C ++, я не могу дать вам код, чтобы сделать это, но я предполагаю, что вы уже знаете, как это сделать.

0 голосов
/ 15 марта 2011

Случайный Autonumber PK может позволить вам увеличить параллелизм, так как таблицы Jet / ACE хранятся кластеризованно на PK (т.е. в порядке PK). При произвольном Autonumber сжатая таблица будет храниться в практически случайном порядке, а не с более старыми записями вверху и более новыми записями, сгруппированными вместе в конце.

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

0 голосов
/ 15 марта 2011

Из просмотра различий в поведении между Access 97 / Jet 3.5 и Access 2000 / Jet 4.0 я считаю, что новые записи в Access 2000 уже размещены на своих страницах.Я заметил гораздо больше «вздутия» в файлах базы данных Access 2000 по сравнению с файлами Access 97.

Таким образом, я подозреваю, что ваша проблема больше связана с базовой блокировкой таблиц и индексов, а не с блокировкой записей.Обновление всех индексов может занять некоторое время, то есть миллисекунды.Как утверждает Билл, повторите операцию.Я бы предложил добавить задержку, скажем, 10 или 50 миллисекунд.И ограничьте количество повторений до 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...