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

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
Всем привет!
Перечитал все старые темы, к единому выводу пока не пришел. Может подскажете как лучше реализовать.
Может за время выкристализовалось изящное решение :)

Задача следующая, есть сервер, все пользователи работают только с сервером. Есть функционал документооборота.
По кнопке документооборот запускается скрипт, который маршрутизирует документ (прописывает в документ ряд полей).
Проблема заключается в том, что пользователь 1, держит документ открытым на редактирование, а пользователь 2 нажимает кнопку.
Или наоборот, пользователь 2 нажал кнопку, выбирает пункты, а в этот момент пользователь 1 начинает редактировать документ.

Вопрос, как лучше решить вопрос с блокировкой, чтобы исключить одновременное редактирование и работу скрипта над одним документом.
При этом бывает что пользователь может некорректно завершить работу с документом (зашел в документ, затем подвис комп и он сделал хард-ресет).

Заранее благодарю.
 

homosapien

Green Team
05.07.2018
18
5
BIT
1
Привет!
Тебе еще пару серверов в кластере не хватает для полного счастья. Когда юзвери расползаются по серверам и модифицируют один и тот же документ. Никакие штатные блокировки тут не сработают.
ИМХО
В "процессных" базах давно перешел на диалоги. Никакого открытия дока на редактирование в полном экране. Диалог блокирует фейс клиента, что приучает юзверей не открывать миллион документов на редактирование. Модификация документа происходит после закрытия диалога.
Ну и административный вопрос, если речь идет о документообороте, то логично иметь только одного "автора" на текущем этапе. Если речь о параллельной работе, нужно плодить детей, а не дергать родителя от имени юзверя. Лучше уж runonserver агентом после некого события модифицировать парента.
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
Видимо придется при первом сохранении документа создавать отдельный блокировочный документ.
А затем при редактировании пытаться вписать в него блокирующего пользователя .save(false, false)
Если сохранился то значит заблокировал, если нет - то значит заблокирован кем то другим.
Ну и разблокировать по выходу.

Может можно агентом отслеживать "некорректно вылетевших пользователей" и разблокировать ?
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
все действия над доком сделать в виде запросов, запросы обрабатывает агент на сервере, тем самым никаких конфликтов
все запросы в отдельной базе
 

homosapien

Green Team
05.07.2018
18
5
BIT
1
Видимо придется при первом сохранении документа создавать отдельный блокировочный документ.

Так работает встроенный локер, зачем писать собственный? И еще раз упомяну кластер, где такой подход работать не будет
Идея с запросами хороша, но может тоже не сработать, если юзверь с правами не откроет документ на редактирование минуя кнопки действий с документом
Нужно менять общую концепцию, где документ открывается по родной форме только один раз, в момент создания
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
231
homosapien
Всё работает железобетонно. Во всяком случае у нас с 2003-го года.
Пишите общий обработчик на QO, PO, QMCh, PMCh. Не хотите "интерфейсной защиты" (с помощью обработчиков, чтобы пользователь не смог обойти остановкой отладчика), продумайте модель Readers/Authors.

А вообще у нас такой принцип - при первой же отправке по маршруту документ закрывается на редактирование всем; все изменения - через диалог -> изменения напрямую в документ (если док с ЕГО сервера, и если док не заблокирован кем-то другим, и если на док нет запросов), в противном случае в запрос.

С выходом новой блокировки переписали на неё. Есть проблемы с включением блокировки на разных серверах, а не только на админсервере (приходится выкручиваться делая каждый сервак админсервером и отключая репликацию ACL), - криворукие IBM-архитекторы... Но сочетание Soft-lock и Hard-lock работает нормально.
 
Последнее редактирование:

homosapien

Green Team
05.07.2018
18
5
BIT
1
это все делаю, например - разблокировать док залоченный ХХ часов ;)
эх, вот не хотите вы спокойной жизни :) Док заблокировался Пупкиным и Пупкин вылетел по nsd или по питанию или по сети, да масса вариантов , агент еще не видит залоченого документа, т.к. он свежий, юзвери получают сообщение "Документ заблокирован Пупкиным", звонят Пупкину, Пупкин на голубом глазу сообщает, что ничего не блокирует, юзвери звонят Вам, отвлекают от любимого дела... , в итоге все заняты бурной деятельностью
Борьба с последствиями, а не с причинами.

homosapien
А вообще у нас такой принцип - при первой же отправке по маршруту документ закрывается на редактирование всем; все изменения - через диалог

Плюсую, вот и я о том же, диалог панацея от нерадивых узверей
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
231
Док заблокировался Пупкиным и Пупкин вылетел по nsd или по питанию или по сети, да масса вариантов , агент еще не видит залоченого документа, т.к. он свежий, юзвери получают сообщение "Документ заблокирован Пупкиным"
Если пользователь работает с формой, то используйте Soft-lock, - при всех этих проблемах док автоматом разблокируется.

Мы не использовали агент для авторазблокировки, т.к. когда архитектура продумана правильно, и когда код написан правильно (авторазблокировка при обработке исключений), то вполне достаточно агента ручной разблокировки.
Я несколько раз был по полгода на поддержке после внедрения, и ни разу не пользовался даже таким агентом. Местные админы в ходе эксплуатации пользовались ну очень редко - пару раз в год, когда сервак падал (оставались 1-2 документа, залоченные Hard-lock'ом). Это в случае одновременной работы примерно по 400-500 пользователей на каждом сервере.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Местные админы в ходе эксплуатации пользовались ну очень редко - пару раз в год, когда сервак падал (оставались 1-2 документа, залоченные Hard-lock'ом). Это в случае одновременной работы примерно по 400-500 пользователей на каждом сервере.
я бы сказал это очень повезло с оборудованием, у меня были и проблемы со связиь, сетью, железом
всегда приходилось писать агент, который периодически находил залоченные и разблокировал
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
Итого, получается, лучше всего использовать стандартный механизм.
То есть поднять галку в базе данных allow document locking, для редактирования по форме можно ничего не писать, если один сервер, будет работать soft-locking
А при модификации скриптом, использовать стандартные функции lock и unlock
верно?

а для разлочивания "зависших" дописать чтобы пользователь перезайдя в документ его разлочивал, и на всякий административный агент

Не совсем понятно правда зачем конкретно нужен второй параметр в функции lock

Но вот при поднятой галке в свойствах дока (правая кнопка) появляются функции lock и unlock
И что делать с пользователями которые возьмут да залочат
 
Последнее редактирование:

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
231
Верно.
Иначе, при использовании самописного механизма, при одновременном нажатии несколькими пользователями сразу отгребёте несколько одинаковых доков, "блокирующих" данный док, но от разных пользователей.

а для разлочивания "зависших" дописать чтобы пользователь перезайдя в документ его разлочивал
Это плохая идея. При падении Lotus'а Soft-lok снимается автоматом. А если пользователь клацал агент, обрабатывающий документы из вида, то при открытии дока отгребёте непредусмотренную разблокировку (т.к. она должна происходить в том месте, где произошла блокировка, т.е. в данном случае в агенте).
Зависнуть могут доки только по Hard-lock'у, но это случается крайне редко, и правильное решение "разблокировать или нет" может принять только админ или разраб. Поэтому я только за ручной агент.

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

Но вот при поднятой галке в свойствах дока (правая кнопка) появляются функции lock и unlock
И что делать с пользователями которые возьмут да залочат
Вы сами создаёте себе проблемы. Эти пункты меню не нужны, - и Soft-lock, и Hard-lock прекрасно работают без них.
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
Ну вот получается 3 варианта
1. стандартный lock и unlock (минус - появляются локи и унлоки в меню мыши и в действиях), неясно как сохраняется документ (идет ли проверка всех полей. насколько это быстро и является ли это пересохранением дока с переапдейтами всех видов)
2. запись своего признак блокировки в текущий документ result = doc.save(false, false) (минус - пересохранение дока. переапдейт видов)
3. запись своего признак блокировки в дополнительный документ result = docBlock.save(false, false) (минус- в два раза больше документов)

Ну вот 3 вариант мне пока нравится больше всего.
При первом сохранении на qs основного дока создать док блокировки и его unid поместить в основной.
надо заблокировать - дернул getbyunid, result = docBlock.save(false, false), если тру, то и заблокирован, если нет то выдал свою надпись заблокировал иванов , звоните ему по тел. ххххх
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
231
1. стандартный lock и unlock (минус - появляются локи и унлоки в меню мыши и в действиях)
Пункты меню Lock/Unlock можно отключить так: снять на БД галку "Allow document locking" и поставить "Allow disign locking" - Master lock server инициализируется, и вся функциональность Hard-lock будет работать.

1. стандартный lock и unlock ... неясно как сохраняется документ
Видимо Вы всё-таки не всё прочитали на форуме:
- Hard-lock сохраняет документ;
- здесь есть темы на форуме, где люди выбирали самописную, но потом от неё отказывались и описывали почему.

1. стандартный lock и unlock ... насколько это быстро
Штатная блокировка работает гораздо быстрее самописной. Она надёжная (при правильно написанном коде и логике отсутствует возможность конфликтов), в отличие от самописной. Но сложная - надо с ней серьёзно разбираться.
Основные сложности (решаемые):
- реализовать возможность блокировки на разных серверах (для одного сервера неактуально);
- подружить Soft-lock и Hard-lock;
- реализовать бесконфликтную работу Hard-lock'а при изменении документа одним и тем же пользователем (к примеру, сервером), но разными процессами (к примеру, разными агентами).

Что выбирать, каждый решает сам.
 
  • Нравится
Реакции: Gandliar

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
Вопрос, как лучше решить вопрос с блокировкой, чтобы исключить одновременное редактирование и работу скрипта над одним документом.
концептуально можно подумать про очереди
м.б. задавать очередь по юнид и записывать действие (редактирование), очередь открывать на сервере
 
30.05.2006
1 345
12
BIT
0
.. при использовании самописного механизма, при одновременном нажатии несколькими пользователями сразу отгребёте несколько одинаковых доков, "блокирующих" данный док, но от разных пользователей.
ЭТО - только при "блокировке" более чем на одном сервере одновременно. Но если редактирование открывать на единственном (для данного док-та) сервере, то никаких проблем
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
231
ЭТО - только при "блокировке" более чем на одном сервере одновременно. Но если редактирование открывать на единственном (для данного док-та) сервере, то никаких проблем
Именно на одном.
Какая "самописная" имеется ввиду?
Мы тестили просто - человек 5-7 жали одну и ту же простую кнопку на "три-четыре!", обычно остаётся 2 одинаковых дока, иногда 3.
Код кнопки обычный - на LS берётся выделенный документ, производится проверка на наличие для него документа в БД блокировок и создание своего дока в случае отсутствия.
 
Мы в соцсетях:

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