Блокировка и снятие блокировки
Чтобы предупредить возникновение конфликтных ситуаций, вытекающих из одновременной работы нескольких пользователей с одним объектом, платформа Docsvision предлагает использовать механизм блокировок, который защищает отдельный объект (карточку или строку) от изменений из сессий других пользователей, оставляя его доступным на чтение.
-
Временная, ограниченная сроком существования пользовательской сессии, из которой блокировка была установлена. Такая блокировка снимается автоматически после завершения пользовательской сессии, если объект не был освобожден пользователем самостоятельно.
-
Постоянная, действующая во время существования пользовательской сессии, из которой блокировка установлена, а также после её завершения. Данная блокировка может быть снята только явно — тем, кто её установил, либо администратором системы.
Базовый API
Базовый API предоставляет методы для установки блокировки на карточку, строку и файл.
CardData cardData = userSession.CardManager.GetCardData(cardId); (1)
card.PlaceLock(); (2)
card.PlaceLock(true); (3)
1 | Получаем карточку. |
2 | Устанавливаем временную блокировку. |
3 | Устанавливаем постоянную блокировку. |
SectionData section = card.Sections[sectionId] (1)
section.FirstRow.PlaceLock() (2)
1 | Получаем секцию, содержащую блокируемую строку. |
2 | Для примера, устанавливаем временную блокировку на первую строку секции. |
FileData fileData = userSession.FileManager.GetFile(fileId); (1)
fileData.PlaceLock(true); (2)
1 | Получаем файл. |
2 | Устанавливаем постоянную блокировку. |
Помимо методов блокировки, классы карточек (CardData
), строк (RowData
) и файлов (FileData
) содержат методы снятия блокировки, определяемые интерфейсом ILockable
:
-
RemoveLock
— снимает блокировку с объекта, установленную в собственной сессии. -
ForceUnlock
— принудительно снимает блокировку, в т.ч. установленную другим пользователем — необходимы административные права.
ILockable
определяет несколько свойств:-
LockStatus
— состояние блокировки. -
LockOwner
— учетная запись сотрудника, выполнившего блокировку.
Устанавливать блокировку на объект рекомендуется во всех сценариях, связанных с изменением данных, непосредственно после получения объекта. В сочетании с проверкой состояния блокировки код может быть следующим:
if (cardData.LockStatus = LockStatus.Free) (1)
{
cardData.PlaceLock(); (2)
}else
{
MessageBox.Show("Карточка заблокирована пользователем " + cardData.LockOwner);
}
1 | Проверяем наличие блокировки у карточки.
|
2 | Установка временной блокировки. |
Помимо методов, которые предлагают классы карточек, строк и файлов, базовый API предоставляет специальный объект для работы с блокировками — менеджер блокировок.
LockManager lockManager = userSession.LockManager;
-
GetLockableObject
— возвращает интерфейсILockable
для карточки с определённым идентификатором. -
GetLockedObjects
— предоставляет заблокированные объекты определённого типа, с возможностью получения объектов, заблокированных только текущим пользователем.
Объектная модель
-
Методы контекста объектов:
-
ObjectContext.LockObject
— установка блокировки, в т.ч. постоянной. -
ObjectContext.UnlockObject
— снятие собственной блокировки.
-
BaseCard card = objectContext.GetObject<BaseCard>(cardId); (1)
objectContext.LockObject(card, true); (2)
1 | Получаем карточку (или строку). |
2 | Устанавливаем постоянную блокировку. |
BaseCardSectionRow row = objectContext.GetObject<BaseCardSectionRow>(rowId); (1)
objectContext.LockObject(row, true); (2)
1 | rowId — идентификатор блокируемой строки. |
2 | Методы сервиса для работы с блокировками — ILockService:
|
Далее приведён пример, в котором документ (карточка типа Документ) блокируется для изменения, после чего блокировка снимается.
ILockService lockService = objectContext.GetService<ILockService>(); (1)
Document document = objectContext.GetObject<Document>(cardId); (2)
if (!(lockService.IsObjectLockedByAnotherUser(document)) (3)
{
lockService.LockObject(document); (4)
document.MainInfo.Name = "Новое название документа"; (5)
objectContext.SaveObject(document);
lockService.UnlockObject(document); (6)
}
1 | Получение сервиса для работы с блокировками. |
2 | Получение изменяемого документа. |
3 | Проверяем, что объект не заблокирован. |
4 | Блокируем документ для изменения. |
5 | Вносим изменение. В качестве примера, изменяется название документа.
Блокировка и снятие блокировки со строк выполняется аналогично. |