LockModeType.PESSIMISTIC_WRITE использует кэшированное значение

Мне показали билет, где @Lock(LockModeType.PESSIMISTIC_WRITE) использует кэшированное значение

Пример:

Существует модель авторизации:

public class Authorization {
...
@ManyToOne
@JoinColumn(name = "wallet_id", nullable = false)
private Wallet wallet;
...
}

Запрос сделан

@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select a from Authorization a " +
       "where ((a.id in ?1)")
List<Authorization> findAllAuthorize(Set<UUID> authorizeList);

Здесь генерируется несколько запросов, где авторизация извлекается для обновления, но создается отдельный запрос для извлечения кошелька, и этот запрос извлекается не для обновления (так как мы не используем что-то вроде join fetch a.wallet w ").

После некоторых действий новый запрос сделан как

@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Wallet> findByOwnerIdIn(Set<String> ownerIds);

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

Так что мой вопрос, это ожидаемое поведение. Можно ли каким-то образом убедиться, что второй запрос не будет использовать результаты первого запроса, но сделает запрос к базе данных с использованием аннотаций данных весны?

0 ответов

Другие вопросы по тегам