Блокировака документов

  • Автор темы Автор темы FEDAZzZ
  • Дата начала Дата начала
Дело в том, что не случайно существуют системные блокировки, а не самодельные... Знаете в чем Ваша ошибка? Между проверкой, что какое-то поле непустое, и последующим действием проходит какое-то время. Вот как раз в этот промежуток времени это поле может быть заполнено другим агентом.
Согласен. Между обращением к 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
 
Интересно также, как блокировка каждого обрабатываемого агентом документа скажется на производительности, как измениться время выполения агента... на неком объеме документов проверить бы.
 
Интересно также, как блокировка каждого обрабатываемого агентом документа скажется на производительности, как измениться время выполения агента... на неком объеме документов проверить бы.
Провел опыт. Не совсем чистый, но вдруг кому пригодится:
Сервер: 7.0.3. (master lock server )
агент1: проход по коллекции: меняем поле в документе, сохраняем
агент2: проход по коллекции: лочим, меняем поле в документе, сохраняем, разлачиваем.
Оба агента запускаются на сервере. Результаты для коллекции 10,000 документов.
# запуска: блокировка выкл : блокировка вкл
1 : 103,66 секунд : 110,41 секунд
2 : 71,19 секунд : 124,58 секунд
3 : 141,09 секунд : 183,81 секунд
Выводы каждый делает сам.
IMHO: видно, что блокировка увеличивает время выполнения агента. Однако увеличение не вылазит за пределы погрешности измерения, учитывая 100% разброс между 2-м и 3-м запусками. Так что, в случае выполнения агента на master lock сервере, считаю влияние блокировки на производительность несущественным.

Использование блокировок хреново скажется для распределенной архитектуры в случае плохого канала до master lock server. Даже просто открыть документ на редактирование будет пыткой пользователя.
 
В общем, по-моему, разобрались. Болкировки - полезная функция. Осталось ещё только реализовать механизм timeout, чтобы агент снимал все зависшие блокировки (используя поле $WritersDate) и реализовать обработку ситуации, когда он снял блокировку с документа, который просто пользователь оставил надолго открытым в режиме редактирования (видимо перед сохранением документа нужно проверять, по-прежнему ли он заблокирован). И вроде усё.
Ещё бы нам IBM в Lotus Notes/Domino добавил поддержку транзакций (Begin Transaction, Commit and Rollback), пишут, что даже планировали когда-то давно, вот тогда будет полное счастье практически.
 
Оптимальнее всего было бы реализовать выскакивающее модальное окошко с предупреждением, что слишком долго документ висит в режиме редактирования, поэтому его следует закрыть. А уже потом, только разблокировать его через некоторое время, если пользователь не реагирует на предупреждение. Надо бы подумать, как реализовать вызов модального окошка без лишних извратов... Серверный агент его выдать не сможет.
 
Я пытаюсь снять блокировку принудительно.
REM Unlock document
REM Document is not unlocked if error is raised
On Error Goto errh
Call doc.UnLock
Print "Document unlocked"
Exit Sub
errh:
Print "Document NOT unlocked"
Exit Sub


Так она не снимается! Такое может быть? Может нужны права администратора на сервере?
 
kilcher
нужны права менеджера тому кто выполняет разлочинье (подписал агент)
 
Так что за ошибка? Может doc не определен. :(
 
Ну вот. По-русски всё написано. :(
В база выключена блокировка.
 
Ну вот. По-русски всё написано. :(
В база выключена блокировка.

Как это?! Если при открытии документ появляется сообщение о том,что документ уже редактирует другой пользователь? Если в базе не стоит блокировка,откуда это сообщение?
 
Это другая блокировка. К сабжевой не имеет отношения.
 
Это другая блокировка. К сабжевой не имеет отношения.


Пожалуйста, объясните какая. Ну очень надо!!!! Я так понимаю,та которая на сервере ставится? Как с этой бедой справляться? Unlock не поможет значит :(
 
Notes error:Attempted a lock operation on a DB that doesn't support locking
в строчке Call doc.UnLock
Возможность блокировки документов в БД включена? ( Database Properties, первая закладка, галка "Allow document locking" )
Можно перед doc.UnLock вставить проверку if doc.ParentDatabase.IsDocumentLockingEnabled then ...
 
Посмотри в хелпе Document locking.
С какой бедой? С сообщением, что документ редактируется другим пользователем? Имхо никак не надо, т.к. это не беда.
 
Возможность блокировки документов в БД включена? ( Database Properties, первая закладка, галка "Allow document locking" )
Можно перед doc.UnLock вставить проверку if doc.ParentDatabase.IsDocumentLockingEnabled then ...


Неа не стоит галка.

Посмотри в хелпе Document locking.
С какой бедой? С сообщением, что документ редактируется другим пользователем? Имхо никак не надо, т.к. это не беда.

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

Механизм лотусовских блокировок в данной базе не очень нужен. Т.к. о каждым шаге(смене статуса) документа пользователям летит уведомление. По типу: ваша очередь работать с документом.
База документов на проверку. В нее выкладываются документы,затем они отправляются на проверку. Если все ок идут на выпуск. Если нет обратно автору.
Так вот ,в основном,после стадии проверки на следующем шаге возникает эта ошибка. Т.е. документ проверили->отправили автору на доработку.......
А он ничего сделать не может из-за блокировки! :( Как будто проверяющий не закрыл документ
Базу я практически с нуля делала. И не писала там блокировок.
 
Потому что надо не документ отправлять на проверку, а копию документа. Оригинал вообще не трогать.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab