Я пытаюсь использовать ручную блокировку внутри метода 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.
Ни один из них не изменил мои результаты .