Поддерживает ли ACEDAO блокировку на уровне строк?
Проблема с DAO 3.6 заключалась в том, что она не поддерживала блокировку на уровне строк. Подробнее см. В этой статье базы знаний.
Я узнал из блога команды доступа:
В Office Access 2007 новые объекты, свойства и методы будут добавлены в DAO для поддержки новых функций в ядре базы данных Access.
Если посмотреть на эту библиотеку в обозревателе объектов редактора Access2007 Visual Basic, то новое воплощение называется ACEDAO. Я могу найти упоминание об acedao.dll в исправлениях на MSDN, но больше ничего.
Кто-нибудь знает, где можно найти документацию конечного пользователя для ACEDAO?
Как узнать, поддерживает ли ACEDAO блокировку на уровне строк?
2 ответа
Я не верю, что в этой статье базы знаний произошли какие-либо изменения. Однако вы должны помнить, как была реализована блокировка записи.
Помните, что при открытии любой таблицы любым пользователем в сети и включенной блокировкой строки не имеет значения, как DAO/ADO/ACE открывает эту таблицу в коде.
Любые существующие пользователи с блокировкой строк принудительно блокируют строки для той записи, которую они используют. И, поскольку очень редко этот код набора записей будет держать запись открытой / заблокированной в течение любого разумного промежутка времени, то блокировка страницы или строки редко будет иметь значение здесь. Поэтому в большинстве случаев блокировка необходима, когда пользователь редактирует данные в форме. В случае кода это, как правило, редкая проблема.
Таким образом, пользовательские настройки в tools->options действительно определяют этот выбор для пользователя. Чтобы быть действительно ясным здесь, а не разделять волоски, эта настройка блокировки строк для пользовательского интерфейса на самом деле не отменяет выбор, так как по умолчанию она УДАЛЯЕТ проблему.
Помните, как блокировка строк работает, когда вы включаете эту функцию, когда реактивный двигатель просто увеличивает размер записи до размера одной страницы, и поэтому просто использует обычную блокировку страниц, как это было раньше. Это то, что я имею в виду под вопросом. Это не будет отличаться, если пользователь включил блокировку строк, а затем вы попытаетесь захватить запись, заблокированную пользователем с набором записей, который не открыл набор 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 мегабайт данных. Это действительно ОЧЕНЬ большая разница.
По крайней мере, 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