Hibernate JPA / CrudRepository Блокировка сущностей в Spring Boot - PullRequest
0 голосов
/ 15 октября 2018

У меня возникает следующая проблема с приложением REST, которое я пытаюсь разработать: в одном из моих классов обслуживания у меня есть метод для удаления объекта из моей базы данных при уведомлении пользователя, если этот ресурс не существует, аналогичноследующее:

@Transactional
public class MyEntityService {

    @Autowired
    private MyEntityrepository repo

    public void delete(String name) {
        MyEntity e = repo.findByName(name)
                      .orElseThrow(() -> new ResourceNotFoundException(name));
        repo.delete(e);
    }

}

Есть ли какой-нибудь удобный для меня способ убедиться, что вызовы метода "нет" перекрываются с тем же объектом, что и их цель?Я подумал об использовании метода блокировки EntityManagers (https://www.objectdb.com/api/java/jpa/EntityManager/lock_Object_LockModeType), примерно так:

MyEntity e = repo.findByName(name)
              .orElseThrow(() -> new ResourceNotFoundException(name));
try {
    em.lock(e, LockModeType.PESSIMISTIC_WRITE)
} catch ( PessimisticLockException e) {
    //Handle somehow
}
repo.delete(e);

Но я не уверен, что это правильный путь, или что произойдет, если я попытаюсь удалить родительский объект, которыйкаскадирует его удаление в заблокированную сущность.

1 Ответ

0 голосов
/ 15 октября 2018

Существует два подхода к решению проблемы: Пессимистическая и Оптимистическая блокировки .

Я бы не использовал пессимистическую блокировку на уровне приложения, а скорее обработал бы видимость данных для несколькихтранзакции с использованием уровня изоляции базы данных.Я предполагаю, что вы используете RDMS .Прочтите о механизме управления параллелизмом в вашей базе данных и выберите соответствующий уровень изоляции в соответствии с требованиями вашего приложения. PostgreSQL документация - отличный ресурс.

Тогда вы можете использовать оптимистическую блокировку для решения проблемы потерянных обновлений.Я рекомендую вам прочитать этот отличный ресурс по теме.

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