Oc-windows.ru

IT Новости из мира ПК
6 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

Блокировка записей в Microsoft Access 2007 — ошибка 3218

При работе в 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 / пункт Дополнительно / раздел Дополнительно.

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

  • Режим открытия по умолчанию = общий доступ
  • Блокировка по умолчанию = отсутствует

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

При работе с БД — возникает сабж. Работа такая: есть два потока, которые паралельно работают с одной таблицей в базе, один вставляет записи,а другой удаляет. У каждого потока свой собственный ADOConnection и свои Query.
В чем проблема? Может перейти на одно общее соединений и динамически менять сам запрос?


Ozone © ( 2004-09-30 15:13 ) [1]

Делай добавление/удаление через КС


sniknik © ( 2004-09-30 15:17 ) [2]

> Может перейти на одно общее соединений и динамически менять сам запрос?
обшее в разных потоках? лучше не надо.

каким образом «один вставляет записи,а другой удаляет»?


Nikolay M. © ( 2004-09-30 15:51 ) [3]

Читать еще:  Access самоучитель с примерами скачать бесплатно


> каким образом «один вставляет записи,а другой удаляет»?

Подозреваю, что навигационными методами и что-то намудрил с блокировками LockType.


sniknik © ( 2004-09-30 15:55 ) [4]

> Подозреваю, что навигационными методами
тогда все очень плохо, т.к. > есть два потока


Nikolay M. © ( 2004-09-30 16:27 ) [5]


> sniknik © (30.09.04 15:55) [4]

Во всяком случае на это указывает фраза

> Может перейти на одно общее соединений и динамически менять
> сам запрос?

При изменении DML такая мысль, скорее всего, не прозвучала бы.


UnDISCOvery ( 2004-09-30 16:45 ) [6]

Уточняю данные 🙂
В каждом потоке по SQL запросу:

1. INSERT INTO MyTable
2. DELETE FROM MyTable

Образ действий: MyQuery.ExecSQL 🙂 Никакой навигации

Настройки соединения все по умолчанию


Ozone © ( 2004-09-30 17:43 ) [7]

UnDISCOvery (30.09.04 16:45) [6]


Nikolay M. © ( 2004-09-30 18:14 ) [8]


> UnDISCOvery (30.09.04 16:45) [6]

Вот это надо было бы сразу говорить, чтобы мы тут не гадали на кофе 🙂
Кстати, а аксес 97 или 2000? Могу попытаться протелепатировать, что 97-й. Если да, то скажу свою версию.


UnDISCOvery ( 2004-09-30 18:18 ) [9]

База Акцесс 2000 я так понимаю, dbVersion 4.0


Nikolay M. © ( 2004-09-30 18:24 ) [10]

Версия не прошла 🙁
Но вот случайно веточку нашел:


Ozone © ( 2004-09-30 18:25 ) [11]

UnDISCOvery (30.09.04 18:18) [9]

КС = критическая секция

. хотя может они потокобезопасные. Незнаю. Если да то не поможет.


UnDISCOvery ( 2004-09-30 19:34 ) [12]

где-то читал что ADO потокобезопасные, но не в help`е 🙂


UnDISCOvery ( 2004-09-30 19:47 ) [13]

Я так понимаю что надо поиграть настройками ADOConnection, а именно «Mode» и «IsolationLevel»

Свойство RecordLocks (Блокировка записей)

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

Применение

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

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

Замечания

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

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

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

Читать еще:  Склад на access

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читать еще:  Access связанные списки

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

Пример

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

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

На этом шаге рассмотрим настройку других параметров.

Для настройки параметров в окне Параметры имеется вкладка Другие (рис. 1.), содержащая следующие разделы:

Операции DDE. Позволяет установить следующие параметры:

  1. Пропуск команд DDE. Если данный флажок установлен, то команды DDE, поступающие из других приложений, игнорируются.
  2. Обновление связей DDE. Этот флажок устанавливается для обновления связей DDE с интервалом, указанным в поле Период обновления (с).

Режим открытия по умолчанию. Позволяет установить следующие параметры:

  1. Общий доступ. По умолчанию база данных будет открываться для общего доступа.
  2. Монопольный доступ. По умолчанию база данных будет открываться для монопольного доступа.

Блокировка по умолчанию. Управляет используемым по умолчанию режимом блокировки записей в сети. Позволяет установить следующие параметры:

  1. Отсутствует. Редактируемая запись не будет блокироваться.
  2. Всех записей. Происходит блокирование всех записей в редактируемой форме или таблице сразу после их открытия.
  3. Изменяемой записи. Блокируется только редактируемая запись.

Блокировка записей при открытии БД. Флажок устанавливается для использования блокировки на уровне записей в текущей базе данных по умолчанию. Если флажок снят, то используется по умолчанию блокировка на уровне страниц (при которой блокируются все записи на странице на диске). Если флажок установлен, блокировка на уровне записей становится стандартным режимом блокировки при доступе к данных через формы, объекты в режиме таблицы и программы, которые используют набор записей для переходов по записям. Это не относится к запросам на изменение и к программам, выполняющим массовые операции с помощью инструкций SQL.

Аргументы командной строки. Вводятся значения, которые должна возвращать функция Command.

Время ожидания OLE/DDE (c). Промежуток времени, после которого Microsoft Access повторяет неудачную попытку выполнения операций OLE или DDE, в пределах от 0 до 300 секунд.

Период обновления. Промежуток времени, после которого Microsoft Access автоматически обновляет записи в режиме таблицы или формы, в пределах от 1 до 32766 секунд.

Число повторов обновления. Число попыток сохранения измененной записи, если эта запись заблокирована другим пользователем (от 0 до 10).

Период обновления ODBC (c). Промежуток времени, после которого Microsoft Access автоматически обновляет записи, доступ к которым осуществляется по протоколу ODBC, в пределах от 1 до 32766 секунд. Данная настройка действует только для базы данных, используемой в режиме общего доступа в сети.

Период повтора обновления (мc). Промежуток времени, после которого Microsoft Access автоматически повторяет попытку сохранения измененной записи, если эта запись заблокирована другим пользователем, в промежутке от 0 до 1000 миллисекунд.

Предыдущий шаг Содержание

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