• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы FEDAZzZ
  • Дата начала
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
 
E

Extraterrestrial

Интересно также, как блокировка каждого обрабатываемого агентом документа скажется на производительности, как измениться время выполения агента... на неком объеме документов проверить бы.
 
T

turumbay

Интересно также, как блокировка каждого обрабатываемого агентом документа скажется на производительности, как измениться время выполения агента... на неком объеме документов проверить бы.
Провел опыт. Не совсем чистый, но вдруг кому пригодится:
Сервер: 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. Даже просто открыть документ на редактирование будет пыткой пользователя.
 
E

Extraterrestrial

В общем, по-моему, разобрались. Болкировки - полезная функция. Осталось ещё только реализовать механизм timeout, чтобы агент снимал все зависшие блокировки (используя поле $WritersDate) и реализовать обработку ситуации, когда он снял блокировку с документа, который просто пользователь оставил надолго открытым в режиме редактирования (видимо перед сохранением документа нужно проверять, по-прежнему ли он заблокирован). И вроде усё.
Ещё бы нам IBM в Lotus Notes/Domino добавил поддержку транзакций (Begin Transaction, Commit and Rollback), пишут, что даже планировали когда-то давно, вот тогда будет полное счастье практически.
 
E

Extraterrestrial

Оптимальнее всего было бы реализовать выскакивающее модальное окошко с предупреждением, что слишком долго документ висит в режиме редактирования, поэтому его следует закрыть. А уже потом, только разблокировать его через некоторое время, если пользователь не реагирует на предупреждение. Надо бы подумать, как реализовать вызов модального окошка без лишних извратов... Серверный агент его выдать не сможет.
 
K

kilcher

Я пытаюсь снять блокировку принудительно.
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


Так она не снимается! Такое может быть? Может нужны права администратора на сервере?
 
M

morpheus

kilcher
нужны права менеджера тому кто выполняет разлочинье (подписал агент)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Так что за ошибка? Может doc не определен. :(
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Ну вот. По-русски всё написано. :(
В база выключена блокировка.
 
K

kilcher

Ну вот. По-русски всё написано. :(
В база выключена блокировка.

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Это другая блокировка. К сабжевой не имеет отношения.
 
K

kilcher

Это другая блокировка. К сабжевой не имеет отношения.


Пожалуйста, объясните какая. Ну очень надо!!!! Я так понимаю,та которая на сервере ставится? Как с этой бедой справляться? Unlock не поможет значит :(
 
T

turumbay

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 ...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Посмотри в хелпе Document locking.
С какой бедой? С сообщением, что документ редактируется другим пользователем? Имхо никак не надо, т.к. это не беда.
 
K

kilcher

Возможность блокировки документов в БД включена? ( Database Properties, первая закладка, галка "Allow document locking" )
Можно перед doc.UnLock вставить проверку if doc.ParentDatabase.IsDocumentLockingEnabled then ...


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

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

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

turumbay

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

kilcher

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

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Потому что надо не документ отправлять на проверку, а копию документа. Оригинал вообще не трогать.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!