В Spring Data JPA, когда я использую @NamedQueries с lockMode = LockModeType.WRITE, я могу видеть результаты в журналах (при условии, что jpa.show-sql - это true):
... SELECT ... FOR UPDATE
Однако, когда я использую аннотацию @Lock(LockModeType.WRITE) для метода, я ничего не вижу в журналах. Я хочу убедиться, что запорный механизм работает должным образом.
How can I see that
@Lock(LockModeType.WRITE)is working? What log level should be enabled?
Обновлено: Вот отрывок из моего кода:
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Transactional
public User checkCredentials(String email, String password, String verificationCode)
throws BadCredentialsException {
User user = userRepository.findByEmail(email);
if (user == null)
throw new BadCredentialsException("Invalid username");
...
user.setLastVerificationCode(verificationCode);
userRepository.save(user);
return user;
}
}
@SimonMartinelli: Я установил @Lock для метода в JpaRepository. Отдельно я также попытался установить его на метод в @Service, который использовал репозиторий (просто из любопытства).
А на сервисе есть @Transacational?
@SimonMartinelli: Да; см. отредактированный вопрос. Я добавил отрывок из своего кода. Фактически он пытается аутентифицировать пользователя по его электронной почте, (обычному) паролю и проверочному коду. Если все в порядке, в БД заносится последний проверочный код. Я хочу заблокировать строку, соответствующую пользователю, чтобы никакие два потока (транзакции) не читали и не записывали ее одновременно.





Вы использовали неправильный LockModeType: LockModeType.WRITE является синонимом LockModeType.OPTIMISTIC_FORCE_IMCREMENT
@Lock(LockModeType.PESSIMISTIC_WRITE)
И вы можете удалить @Lock из вашего метода услуга, потому что @Lock работает только с методами хранилище. Также важно добавить @Transactional к соответствующим методам услуга.
Подробнее про LockModes здесь
https://docs.oracle.com/javaee/7/api/javax/persistence/LockModeType.html
Большое спасибо. Для дальнейшего использования, вот документация LockModeType из Java EE 8: javaee.github.io/javaee-spec/javadocs/javax/persistence/…
Чтобы убедиться: вы установили эту аннотацию для метода запроса в JpaRepository?