Пессимистическая блокировка
Пессимистическая блокировка может использоваться, когда существует высокая вероятность одновременного редактирования одного и того же экземпляра сущности. В таких случаях оптимистическая блокировка, основанная на управлении версиями сущностей, приводит к слишком многим конфликтам.
Пессимистическая блокировка явно блокирует экземпляр сущности, когда он открывается на экране редактирования UI или в подробном представлении Flow UI. В результате только один пользователь может редактировать этот конкретный экземпляр сущности в данный момент времени.
Также механизм пессимистической блокировки Jmix также использоваться для управления одновременным выполнением произвольных процессов. Ключевым преимуществом является распределение блокировок, поскольку они реплицируются в кластере.
Установка
Для автоматической установки через маркетплейс Jmix обратитесь к инструкции в разделе Дополнения.
Чтобы установить дополнение вручную, добавьте следующие зависимости в ваш build.gradle
:
implementation 'io.jmix.pessimisticlock:jmix-pessimisticlock-starter'
implementation 'io.jmix.pessimisticlock:jmix-pessimisticlock-flowui-starter'
Использование
Чтобы включить пессимистическую блокировку для любой сущности, добавьте аннотацию @PessimisticLock
к классу сущности, например:
@PessimisticLock(timeoutSec = 120)
@JmixEntity
@Table(name = "DOCUMENT")
@Entity
public class Document {
// ...
Стандартный экран деталей сущности автоматически обрабатывает пессимистичное блокирование, переключаясь в режим "только для чтения", если сущность кем-то уже заблокирована.
Вы также можете заблокировать объект в своем коде, используя бин LockManager
. Например:
@Autowired
private LockManager lockManager;
public void lockAndProcessDocument(Document document) {
LockInfo lockInfo = lockManager.lock(document);
if (lockInfo != null) {
throw new IllegalStateException("Document is already locked by " +
lockInfo.getUsername());
}
try {
processDocument(document);
} finally {
lockManager.unlock(document);
}
}
См. Javadocs интерфейса LockManager
для получения дополнительной информации.
Истечение блокировок
Атрибут аннотации timeoutSec
определяет время истечения срока действия блокировки в секундах. Значение по умолчанию – 300 секунд.
Для истечения срока действия автоматической блокировки требуется планировщик заданий Quartz. Его можно предоставить, включив в проект дополнение Quartz.
Следующие свойства приложения управляют механизмом истечения срока блокировок:
-
Установите
jmix.pslock.use-default-quartz-configuration
вfalse
, чтобы отключить механизм истечения срока блокировок по умолчанию. Значение этого свойства по умолчанию –true
. -
Используйте
jmix.pslock.expiration-cron
, чтобы задать выражение Cron для расписания истечения срока блокировок. Значение по умолчанию –0 * * * * ?
, что означает "каждую минуту".