Пессимистичная блокировка в автономном режиме (Java, Spring) - PullRequest
3 голосов
/ 19 ноября 2010

Я пытаюсь реализовать пессимистичную автономную блокировку, используя Spring и JPA / Hibernate. В моей базе данных есть таблица блокировок, в которой хранятся все блокировки (идентификатор заблокированной записи, отметка времени и пользователя). Интерфейс сервиса LockManager выглядит так:

public interface LockManager {

    @Transactional(isolation=Isolation.SERIALIZABLE)    
    public Boolean TestAndGetLock(Application app, User user);

    public void realeaseLock(Application app, User user);
}

Метод TestAndGetLock сначала проверяет, существует ли существующая блокировка записи. Если есть, он возвращает истину и завершается. Если его нет, он возвращает false и создает блокировку (записывает новую блокировку в таблицу блокировок). Только тогда веб-приложение фактически запускает бизнес-транзакцию (в этом случае она показывает форму редактирования для приложения, переданного в качестве параметра).

Не могли бы вы сказать, правильный ли этот дизайн?

1 Ответ

1 голос
/ 19 ноября 2010

Я бы исправил дизайн так:

public boolean lock(Application app, User user);

public void unlock(Application app, User user);

, поэтому здесь имена будут более понятными.Поведение будет следующим: клиентский код вызывает lock (), и если он заблокировал что-то, он возвращает true, иначе false.Это исправляет некоторые недоразумения в вашем API: если он успешно заблокировал что-то, то почему он возвращает false?Кроме того, было бы проще написать код клиента:

if (lockManager.lock()) {
...
} else {
   throw new LockNotObtainedException()
}

Второй метод, на мой взгляд, в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...