У меня есть следующий метод сервиса Java Spring, который создает нового пользователя или возвращает существующего:
@Transactional
public User createIfNotExists(User telegramUser, Long referrerTelegramId) {
User user = findByTelegramId(Long.valueOf(telegramUser.getId()));
if (user == null) {
user = create(telegramUser, referrerTelegramId);
}
return user;
}
@Override
public User findByTelegramId(Long telegramId) {
return userRepository.findByTelegramId(telegramId);
}
public interface UserRepository extends CrudRepository<User, Long> {
User findByTelegramId(Long telegramId);
}
В настоящее время я не могу синхронизировать метод createIfNotExists в параллельной многопоточной среде. Я наложил уникальное ограничение на поле users.telegramId:
@Column(name = "telegram_id", unique = true, nullable = false)
private Long telegramId;
и время от времени я получаю duplicate key violates unique constraint
.
Как правильно настроить метод createIfNotExists для получения пессимистической блокировкиfindByTelegramId?