T
turumbay
Согласен. Между обращением к lockHolders и lock возможна блокировка агентом-конкурентом.Дело в том, что не случайно существуют системные блокировки, а не самодельные... Знаете в чем Ваша ошибка? Между проверкой, что какое-то поле непустое, и последующим действием проходит какое-то время. Вот как раз в этот промежуток времени это поле может быть заполнено другим агентом.
Проверил возможность блокировки на произвольное имя - работает.
Переделываем так:
....
if doc.LockHolders(0) <> "" then
' отработка ситуации, согласно логике приложения
Call processConflict( doc )
else
' ловим ошибку блокировки
on error goto lockhandle
' блокируем.
call doc.Lock( agent.Name & agent.ParentDatabase.ReplicaId ) '
' разлочить надо по-любому....
on error goto errhandle
' что-то делаем с документом
Call doSomething( doc )
' сохраняем
Call doc.Save( false , false )
' отпускаем
Call doc.UnLock
end if
exit function
lockhandle:
Call processConflict( doc )
exit Function
errhandle:
Call doc.UnLock
exit Function