Транзакция Jpa несколько

#java #spring #jpa #concurrency

Вопрос:

У меня есть проблема в конкретной ситуации.

Представьте, что у меня есть столик для покупки билета на концерт, и свободным остается только 1 билет.

2 пользователя (A и B), почти одновременно, пытаются приобрести этот билет.

Фактический идентификатор билета таблицы(билет) 1 пользователь(куплен) null

так что теперь там билет 1 бесплатный

Первым, кто попытается купить этот билет, будет A, через 1 секунду попробуйте B. Код транзакции следующий… (Я поставил нить.спящий режим для моделирования..)

 @Transactional
public String getTicket(String user, Long idTicket) {
    Ticket ticket = ticketRepository.findByIdAndUserNull(idTicket);
    if(ticket == null)
         return "ticket not available";
    
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ticket.setUser(user);
    
    return "TICKET PURCHASED";
}
 

Я ожидал, что пользователь А купит билет в первой транзакции, а Б дождется окончания транзакции… таким образом, билет на получение B недоступен.
Вместо этого я получил такой результат
Таблица
Идентификатор билета(билет) 1
пользователь(куплен) B

кто-нибудь знает, возможно ли выполнить одну транзакцию за раз или решение для этого?

Большое спасибо

Daniele