Поддерживает ли ACEDAO блокировку на уровне строк? - PullRequest
3 голосов
/ 13 июля 2009

Проблема с DAO 3.6 заключалась в том, что она не поддерживала блокировку на уровне строк. Подробнее см. в этой базе знаний статья.

Я узнал из блога Access team :

В Office Access 2007 новые объекты, свойства и методы будут добавлены в DAO для поддержки новых функций в Движок базы данных Access.

При просмотре этой библиотеки в обозревателе объектов редактора Access2007 Visual Basic новое воплощение называется ACEDAO. Я могу найти упоминание об acedao.dll в исправлениях на MSDN, но больше ничего.

Кто-нибудь знает, где можно найти документацию конечного пользователя для ACEDAO?

Как узнать, поддерживает ли ACEDAO блокировку на уровне строк?

Ответы [ 2 ]

7 голосов
/ 13 июля 2009

Я не верю, что в этой статье базы знаний произошли какие-либо изменения. Однако вы должны помнить, как была реализована блокировка записи.

Помните, что когда любая таблица любого пользователя в сети открыта и у них включена блокировка строк, то не имеет значения, как DAO / ADO / ACE открывает эту таблицу в коде.

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

Таким образом, пользовательские настройки в tools-> options действительно определяют этот выбор для user . Чтобы быть действительно ясным здесь, а не разделять волосы, эта настройка блокировки строк для пользовательского интерфейса на самом деле не отменяет выбор, так как по умолчанию она УСТАВАЕТ проблему.

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

Нет такой вещи, как настоящая блокировка строки. Однако если вы увеличите размер записи до одной страницы, то достигнете той же цели окольным путем.

Учитывая приведенную выше информацию, это означает две вещи:

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

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

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

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

Вы можете узнать, что ACE + dao может открыть reocrdset с блокировкой строк, но зачем беспокоиться? Вы не используете Дао, и вам все равно это не нравится. И, в любом случае, это вряд ли изменит ваши пользовательские сценарии.

- изменить:

У меня нет удобной ссылки, объясняющей эту блокировку страницы записи. Я знаю, что где-то читал, но у меня нет ссылки.

Я был очень занят последние несколько дней (я участвую в бета-версии Access 2010, и в понедельник также публикуется CTP для публичных людей, которые подписались). Итак, я был очень занят в последнее время.

Однако вы можете попробовать какой-нибудь код, который покажет это. Следующий код вызывает около 1 мегабатта на MDB без включенной блокировки строк. (от примерно 5,8 мегабайта до примерно 6,5).

Dim rst        As DAO.Recordset
Dim i          As Long
Dim t          As Single

Set rst = CurrentDb.OpenRecordset("contacts")

t = Timer
Me.Text1 = "working..."
DoEvents
Do While rst.EOF = False
   rst.Edit
   i = i + 1
   rst!City = "ci " & i
   rst.Update

   rst.MoveNext

   If i Mod 500 = 0 Then
      Me.Text1 = i
      DoEvents
   End If


Loop

t = Timer - t
Me.Text1 = "done in " & t & " seconds"
Beep

Если запустить то же самоеде с блокировкой записи, файл становится колоссальным 123 мегабайта. Вот ссылка на образец mdb с приведенным выше кодом

http://www.kallal.ca/test/bloat.zip

Итак, скачайте выше. Запустите его с помощью инструментов-> Опции-> Дополнительно-> Открыть с блокировкой уровня строки.

Затем очистите стол. Компакт и ремонт. Измените вышеуказанный параметр и запустите его снова (убедитесь, что вы выходите, а затем повторно вводите базу данных после изменения этого параметра).

Если вы запускаете выше без блокировки строк .. файл увеличивается примерно на один мегабайт. Если вы запустите его с блокировкой строк, вы получите более 110 мегабайт данных. Это ОЧЕНЬ большая разница.

0 голосов
/ 17 января 2011

ACEDAO, по крайней мере, и, скорее всего, DAO по умолчанию использует блокировку на уровне записи, независимо от документации MS. Об этом свидетельствует раздувание (упомянутое выше), которое возникает после переключения с базовой БД Access 97 на Access 2000 или ACCDB с использованием того же кода DAO.

Подробнее см. Мой ответ здесь:

Лучше ли использовать ADO или DAO в Access 2007?

Отредактировано, чтобы отразить ссылку MSDN, содержащую правильную информацию:

"Блокировка на уровне записей используется по умолчанию для объектов записей ADO и DAO. Блокировка на уровне страниц используется по умолчанию для операторов SQL DML (массовых операций, таких как операторы UPDATE, DELETE и INSERT INTO), которые используют объекты команд ADO или DAO Объекты QueryDef. "

http://msdn.microsoft.com/en-us/library/aa165435(office.10).aspx

...