У меня есть критическая часть кода, где мне нужно прочитать и заблокировать сущность по идентификатору с пессимистической блокировкой.
Этот раздел кода выглядит следующим образом:
MyEntity entity = entityManager.find(MyEntity.class, key);
entityManager.refresh(entity, LockModeType.PESSIMISTIC_WRITE);
Работает нормально, но, как я понимаю, в случае, когда в кэше hibernate нет сущности, мы будем использовать 2 транзакции чтения в базу данных. 1-я транзакция для поиска объекта по идентификатору и другая транзакция для обновления и блокировки объекта.
Можно ли в таком сценарии использовать только одну транзакцию?
Я хотел бы представить что-то вроде:
boolean skipCache = true;
MyEntity entity = entityManager.find(MyEntity.class, key,
LockModeType.PESSIMISTIC_WRITE, skipCache);
Но нет такого параметра, как skipCache
. Есть ли другой подход для чтения сущности по идентификатору непосредственно из базы данных, используя EntityManager
?
UPDATE:
Этот запрос попадет в кэш первого уровня, если сущность существует в кеше. Таким образом, он может потенциально вернуть устаревшие данные, и поэтому не подходит для критических разделов, где любое чтение должно быть заблокировано:
MyEntity entity = entityManager.find(MyEntity.class, key, LockModeType.PESSIMISTIC_WRITE);
Вопрос в том, чтобы пропустить кеш, а не в блокировке.