Spring Data JPA, PostgreSQL ВЫБРАТЬ ДЛЯ ВСТАВКИ Синхронизация одновременных вызовов - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть следующий метод сервиса 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...