Пессимистический блокировщик#
Назначением механизма является блокировка записей моделей при их загрузке в различных клиентах и различными пользователями. Это означает, что в один момент времени с одной записью модели может работать только один пользователь в одном клиенте (то есть в рамках одной вкладки браузера). Механизм реализован с помощью выделенного системного веб-сервиса lock.В качестве хранилища информации о блокировках используется redis.
Установка блокировки#
Объектом блокировок стандартной реализации пессимистического блокировщика являются экземпляры моделей. При загрузке экземпляра модели на него может быть установлена блокировка (см. свойство lock в статье Модель и соответствующий раздел статьи Web API (8.4)).
На интерфейсном уровне в связке реестр-документ это производится следующим образом:
- Если в описании модели установлен флаг lock, то при открытии формы документа вместе с загрузкой желаемого экземпляра модели предпринимается попытка установить блокировку данного экземпляра
- Если блокировка установлена, пользователю показывается сообщение об успешном захвате документа
- Если экземпляр модели уже занят, элементы управления на форме документа становятся недоступными для редактирования, а пользователь получает сообщение о том, что документ уже занят пользователем X с момента времени Y
- Если установить блокировку не вышло по каким-то иным причинам, пользователь получает соответствующее сообщение
Владелец блокировки определяется путём сочетания пользователя, идентификатора сессии и идентификатора экземпляра клиента. Например:
ara-lock:instance:tinker:1525429890684-6EH6T23YLgGXWIeC_Gu3Pvcv6CFEaGfW:d8223e93-cfb9-4a85-923e-f038f2103b03
- tinker - имя пользователя
- 1525429890684-6EH6T23YLgGXWIeC_Gu3Pvcv6CFEaGfW - идентификатор сессии
- d8223e93-cfb9-4a85-923e-f038f2103b03 - идентификатор экземпляра клиента
В одном браузере может быть открыто несколько вкладок с самостоятельными экземплярами веб-клиента. В таком случае каждый отдельный экземпляр веб-клиента (находящийся в собственной вкладке браузера) будет иметь уникальный идентификатор клиента, но все они будут относится к одной и той же браузерной сессии.
Снятие блокировки#
Сценарии снятия блокировки:
- Закрытие документа - клиент отправляет запрос на снятие блокировки с закрываемого документа
- Выход из системы - клиент отправляет запрос на снятие всех блокировок, установленных текущим пользователем в текущей сессии
- Закрытие вкладки браузера - клиент отправляет запрос на снятие всех блокировок, установленных текущим пользователем в текущей сессии с текущего экземпляра клиента
- Ключ блокировки удаляется из хранилища вручную - разработчик, системный администратор или иное лицо (или программа), имеющая доступ к хранилищу, производит удаление ключа (или ключей). Можно использовать форму Блокировки документов
- Истекает время хранения ключа блокировки - см. следующий раздел, а также EXPIRE
Снятие неактивных блокировок#
Во избежание ситуаций, когда установленная пользователем блокировка остаётся активной дольше необходимого, мешая другим пользователям (или даже ему самому) работать с программой, в системе используется подход, согласно которому все блокировки имеют т.н. \"время жизни\" (по умолчанию равное времени жизни сессии), по окончанию которого они будут удалены. Для того, чтобы блокировки не удалялись раньше времени, любая пользовательская активность (выражающаяся путём отправки запросов к серверу) продлевает время жизни блокировок до исходной величины. При этом учитывается пользователь, от имени которого отправлен запрос, идентификатор сессии и идентификатор экземпляра клиента.
Таким образом, если некий экземпляр клиента в рамках определённой сессии пользователя не отправляет запросы к серверу в течение заданного времени, время жизни блокировок, относящихся к этому экземпляру клиента, не будет продлеваться, и они будут удалены по истечении этого времени.
Форма управления блокировками#
Для отладки механизма блокировок документов, а также для иных случаев разработана форма Блокировки документов, позволяющая просматривать и снимать установленные блокировки.
.
В табличной части формы отображается следующая информация:
- ФИО пользователя, заблокировавшего документ
- логин пользователя
- descriptionName из описания модели
- имя модели
- индентификатор документа (по умолчанию VCode)
- дата и время установки блокировки
Нажатие кнопки Снять блокировку в тулбаре позволяет удалить блокировку, которая выделена в табличной части в данный момент.