#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