Access обновление невозможно установлена блокировка

Access обновление невозможно установлена блокировка

При работе в Microsoft Access 2007 возникла проблема — хоть и небольшая, но досадная 🙂

  • используется DAO
  • используется объект Database (как CurrentDb)
  • для организации транзакций, конечно, используется Workspace (как DBEngine.Workspaces(0))
  • в транзакции сначала вносятся исправления в строки при помощи Recordset, затем запускается запрос (при помощи QueryDef) на изменение
  • при выполнении запроса возникает ошибка 3218 "Обновление невозможно;установлена блокировка." ("Could not update; currently locked"), хотя все изменения проходят в рамках одной транзакции 🙁

Dim ws as Workspace, db as Database, rs As Recordset, qd As QueryDef
Dim UpdSQL As String

Set db = CurrentDb
On Error GoTo Finally1

Set ws = DBEngine(0)

ws.BeginTrans
On Error GoTo Except1

Set rs = db.OpenRecordset("Table1", dbOpenDynaset)

If rs.NoMatch Then
rs.AddNew
rs![ > rs![F1] = 2
Else
rs.Edit
End If
rs![F1] = rs![F1] + 100
rs.Update
rs.Close

UpdSQL = "Update Table1 Set [F2] = [F1] + 200"

Set qd = db.CreateQueryDef("", UpdSQL)

qd.Execute dbFailOnError
qd.Close

Except1:
On Error GoTo Finally1
ws.Rollback

Finally1:
On Error GoTo Err_
db.Close

Err_:
‘ обработка ошибки
Resume Exit_

Что характерно — если поменять местами выполнение запроса и обновление записей при помощи Recordset’а (т.е. сначала запрос, потом Recordset), то всё проходит без ошибок 8-( — но тут последовательность выполнения с точки зрения логики была важна.
Как выход — можно всё переписать только на запросах, без использования Recordset’ов — в этом случае тоже всё работает. Но это было бы слишком трудоемко — много таких мест в коде.

Выход оказался прост, но не очевиден — в настройках был установлен флаг Открытие баз данных с использованием блокировки на уровне записей. Нужно этот флаг СНЯТЬ (. ) — и всё работает без ошибок! Хотя, как я понимаю: по умолчанию блокировка записей выполняется страницами, а этот параметр должен включать блокировку по записям — т.е. вроде как "снижать" жёсткость блокировок. 8-(
Находится этот параметр здесь: кнопка Меню / Параметры Access / пункт Дополнительно / раздел Дополнительно.

Также стоит проверить, что другие параметры установлены в значения:

  • Режим открытия по умолчанию = общий доступ
  • Блокировка по умолчанию = отсутствует
Читайте также:  Acpi acpi000c windows 7 x64

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

Применение

С помощью свойства RecordLocks (Блокировка записей) можно определить, как выполняется блокировка записей и что происходит, когда два пользователя одновременно пытаются изменить одну и ту же запись. Значение данного свойства доступно для чтения и записи.

выражение (обязательно). Выражение, возвращающее один из объектов из списка "Применение".

Замечания

Когда вы редактируете запись, Microsoft Office Access 2007 может автоматически блокировать ее, чтобы не допустить ее одновременного изменения другими пользователями.

Формы: определяет, как блокируются записи в базовой таблице или запросе при обновлении данных в многопользовательской базе данных.

Отчеты: определяет, блокируются ли записи в базовой таблице или запросе во время просмотра или печати отчета.

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

Примечание: Свойство RecordLocks (Блокировка записей) используется только в формах, отчетах и запросах в базах данных Microsoft Access (MDB или ACCDB).

Свойство RecordLocks может принимать следующие значения:

(Значение по умолчанию.) В формах одну и ту же запись могут редактировать несколько пользователей одновременно. Такую блокировку также называют оптимистичной. Если два пользователя пытаются сохранить изменения в одной и той же записи, Access выводит сообщение для пользователя, пытающегося сохранить запись вторым. Этот пользователь может отказаться от изменения записи, скопировать ее в буфер обмена или заменить правки, внесенные другим пользователем. Данное значение обычно используется в формах, доступных только для чтения, или в однопользовательских базах данных. Оно также применяется в многопользовательских базах данных, чтобы несколько людей имели возможность одновременно изменять одну и ту же запись.

Читайте также:  Adblock pro для яндекс браузера

В отчете записи не блокируются во время его просмотра или печати.

В запросе записи не блокируются во время его выполнения.

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

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

Примечание: Это свойство можно задать с помощью страницы свойств формы, макроса или кода Visual Basic для приложений (VBA).

Примечание: Изменение свойства RecordLocks открытой формы или отчета приводит к повторному автоматическому созданию набора записей.

Значение "Отсутствует" можно применять для форм в том случае, если только один пользователь работает с базовыми таблицами или запросами и вносит изменения в базу данных.

В многопользовательской базе данных значение "Отсутствует" можно применять, если вы хотите использовать оптимистичную блокировку и достаточно ограничиться предупреждением о том, что другой пользователь также изменил запись. Значение "Изменяемой записи" следует использовать, если требуется запретить одновременное редактирование записи несколькими пользователями.

Параметр "Всех записей" можно использовать, чтобы запретить внесение изменений в данные после начала предварительного просмотра или печати отчета либо выполнения запроса на добавление, удаление, обновление и создание таблицы.

В режиме формы и режиме таблицы в области маркировки каждой заблокированной записи изображается индикатор блокировки.

Чтобы изменить значение свойства RecordLocks, используемое по умолчанию для форм, нажмите кнопку Microsoft Office и щелкните Параметры Access. В диалоговом окне Параметры Access нажмите кнопку Дополнительно и выберите нужный вариант в разделе Блокировка по умолчанию.

Читайте также:  Billing payout request error

Данные в форме, отчете или запросе из базы данных ODBC обрабатываются так, как если бы было выбрано значение "Отсутствует", независимо от настройки параметра RecordLocks.

Пример

В следующем примере для свойства RecordLocks формы Employees задается значение "Изменяемой записи" (страница записей блокируется, как только пользователь начинает изменять любое поле записи, и остается заблокированной, пока он не перейдет к другой записи).

Про АйТи и около айтишные темы

MS Access — Блокировка файла невозможна

Проблема пришла из отдела кадров, сотрудники которого используют много баз данных MS Access. При попытке открыть базу запускается MS Access 2007, но выдает ошибку: «Блокировка файла невозможна» (Could not lock file).

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

Когда MS Access открывает файл с базой .mdb, в этой же папке создает файл блокировки с расширением .ldb, в файл блокировки записывается служебная информация о пользователях, которые работают с базой. В моем случаем у пользователя были права на каталог с базой только на чтение списка содержимого папки, поэтому когда он пытался открыть базу, Access видел, что рядом с базой есть файл название_базы.ldb, пытался его прочитать, но не хватало прав доступа и из-за этого вылетала ошибка «Блокировка файла невозможна».

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

Нашли опечатку в тексте? Пожалуйста, выделите ее и нажмите Ctrl+Enter! Спасибо!

Хотите поблагодарить автора за эту заметку? Вы можете это сделать!

Ссылка на основную публикацию
Adblock detector