Пессимистическая блокировка

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

Пессимистическая блокировка явно блокирует экземпляр сущности, когда он открывается на экране редактирования 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 * * * * ?, что означает "каждую минуту".

Административный UI блокировок

Текущее состояние блокировок можно отслеживать с помощью экрана Pessimistic Locking → Locks. Этот экран также позволяет разблокировать любую сущность.