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


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

Ситуация:

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

Выглядит это примерно так:

'=======================================================================
On Error GoTo Err_

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)

rs.FindFirst "[ID] = 1"

If rs.NoMatch Then
   rs.AddNew
   rs![ID] = 1
   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

ws.CommitTrans dbForceOSFlush

GoTo Finally1

Except1:
On Error GoTo Finally1
ws.Rollback

Finally1:
On Error GoTo Err_
db.Close

GoTo Exit_

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

Exit_:
'=======================================================================

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

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

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

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



Нравится