Приложение, написанное в scala на игровой платформе .
MySql Таблица: Таблица example_table выглядит следующим образом:
CREATE TABLE example_table
(
`itemSetId` BIGINT NOT NULL,
`version` BIGINT(20) NOT NULL,
`status` VARCHAR(20) NULL,
`activatedAt` BIGINT NULL,
`typeA_id` varchar(36) NULL,
`typeB_id` varchar(36) NULL,
PRIMARY KEY (`itemsetId`, `version`)
);
Здесь status может быть активным или неактивным, typeA_id и typeB_id - строки UUID, version - метка времени.
За один раз в таблице должна быть только одна строка для определенного itemsetId с status = active.
Работа API: Оба API делают аналогично для itemsetID, скажем, 123, за исключением того, что API-1 обновляет typeA_id , в то время как API-2 обновляет typeB_id ,
- Читать строка для последней версии (отметка времени) из таблицы с itemsetId = 123 и status = active.
- Выполните некоторые логики уровня обслуживания c и сгенерируйте новый UUID.
- Установите статус строки, выбранной на шаге 1, как неактивно , создайте новую строку в таблице (аналогично выбранной строке на шаге 1) за исключением status = active , и здесь один из API обновляет строку, выбранную на шаге 1, с помощью typeA_id = newUUID, тогда как другой API Обновления typeB_id = newUUID.
В каждый момент времени в таблице должна быть только одна строка для определенного itemsetId с status = active.
Состояние гонки возникает, когда оба API-интерфейса вызываются одновременно. Оба API читают последнюю строку для данного itemsetId и имеют status = active. Оба делают некоторые логики уровня обслуживания c. Но один из API обновляет typeA_id и создает новую строку с status = active, а другой API обновляет typeB_id и создает другую новую строку с статус = активный. Следовательно, у нас есть две строки с status = active, когда мы намеревались иметь одну последнюю строку с status = active, и каждый из типов type__id и typeB_id обновлялся в одной строке. Хотя нам все равно, сколько строк было создано между ними, но в конце концов мы намеревались иметь одну строку с обоими изменениями.
Что на самом деле происходит:
Либо, оба API достигают Вышеупомянутый шаг 3 одновременно создает две строки с обновлениями typeA_id и typeB_id в отдельных строках.
Или один из API завершает шаг 3 и создает новую строку с status = active и typeA_id обновляются, затем другой API достигает шага 3, деактивирует все строки с status = active (включая ту, которая была создана API-1) и создает новую строку с обновленным typeB_id .
Не могу найти конкретное c решение проблемы, пожалуйста, помогите.