Hibernate / Spring: EntityManager.lock будет работать как положено, em.find нет - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь использовать ручную блокировку внутри метода Spring @Transactional, используя

EntityManager.find(class, id, LockModeType.PESSIMISTIC_WRITE);

Однако при просмотре sql hibernate НЕ генерирует никаких операторов select ... for update (приобретите эксклюзивную блокировку в строке БД), как и следовало ожидать, и метод не синхронизируется правильно.

Странно, вызов em.lock() после выборки сущности с использованием em.find() вызывает select ... for update, как и следовало ожидать для find ( ), так же как и добавление аннотации @Lock(PESSIMISTIC_WRITE) к запросу на выборку. Однако я бы предпочел использовать em.find () двум другим методам, но я не могу заставить это работать.

Итак, почему EntityManager.find тихо игнорирует параметры блокировки, в то время как другие методы блокировки работают?

Я использую Hibernate 5.4.4.FINAL, пытался обновить до 5.4.11.FINAL.
Я также пытался установить уровни изоляции на SERIALIZABLE и READ_COMMITTED в @ Transactional.
Ни один из них не изменил мои результаты .

...