Доброго дня!
Делаю учебный проект spring boot + spring data + postgresql. Бронирование авиабилетов. Чтобы исключить возможность покупки лишних билетов, создал таблицу в которой есть информация об оставшемся количестве не проданных билетов. Вместо использования уровня изоляции Serializable, хочу заблокировать только строку через FOR UPDATE и @Lock(LockModeType.PESSIMISTIC_WRITE). Но как сделать так чтобы транзакция не коммитилась до подтверждения оплаты или в течении заданного времени, если оплата не прошла.
Или какой подход вообще использовать в данной ситуации?
На каждую "покупку" создаешь заявку в отдельной таблице "бронь".
При поступлении оплаты - продаешь билет, удаляешь запись из заявок.
С определенной периодичностью проходишь по этой таблице, удаляешь устаревшие заявки.
Вот тут, да - все делаем в транзакции.
Соответственно, при расчете количества доступных билетов считаешь как КОЛ_БИЛЕТОВ - КОЛ_ЗАЯВОК.