Я работаю над устаревшей системой, которая позволяет планировать резервирование.Приложение не имеет состояния REST и предназначено для горизонтального масштабирования.База данных, однако, является общей для всех экземпляров.Прежде чем я получу лекцию по дизайну и масштабу, это не мое - нужно вынести лучшее из плохой ситуации (или кодовой базы).Недавно мы столкнулись с проблемой дублирования бронирований.Я считаю, что это из-за природы потоков ответа на запрос.Процесс в настоящее время: получение запроса, проверка базы данных на предмет противоречивого резервирования времени, если нет, вставкаВ зависимости от времени между чтением и вставкой возможно, что оба будут вставлены.Сценарий выглядит следующим образом:
|------|-------|-------|
R1 C1 I1 RSP
-|--------|-------|---------|
R2 C2 I2 RSP
Где R = Запрос, C = Проверка БД, I = Вставка.
Так что я думаю, что я мог бы использовать аннотацию @Synchronized, которая заставит всетемы для заказа.Проблема заключается в том, что запущено несколько экземпляров, поэтому они не будут работать в целом.Пессимистическое или оптимистическое чтение и запись, кажется, не применимы, так как мы пытаемся сделать комбо чтения и записи, если я полностью не пойму.Любые мысли для решения этой проблемы в масштабе?Предпочел бы обрабатывать его в Java с помощью блокировки таблиц или чего-то подобного, а не добавлять дополнительные сервисы (kafka, redis и т. Д.).
РЕДАКТИРОВАТЬ: база данных выглядит примерно так и использует h2 в dev и mysql в производстве.
id | start_time | locationid | postingid | userid | durration
---------------------------------------------------------------