Блокировка записей в Microsoft Access 2007 - ошибка 3218 |
Опубликовано d.mokshin в ср, 09/05/2012 - 22:14.
|
||
При работе в 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 / пункт Дополнительно / раздел Дополнительно.
Также стоит проверить, что другие параметры установлены в значения:
- Режим открытия по умолчанию = общий доступ
- Блокировка по умолчанию = отсутствует
Последние комментарии
1 год 33 нед. назад
1 год 33 нед. назад
1 год 33 нед. назад
1 год 33 нед. назад
1 год 35 нед. назад
1 год 35 нед. назад
1 год 35 нед. назад
1 год 48 нед. назад
1 год 48 нед. назад
2 гг. 23 нед. назад