Параллельные вызовы API для чтения строки и обновления ее в соответствии с полученным результатом в mysql приводят к состоянию гонки - PullRequest
0 голосов
/ 24 апреля 2020

Приложение, написанное в 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 ,

  1. Читать строка для последней версии (отметка времени) из таблицы с itemsetId = 123 и status = active.
  2. Выполните некоторые логики уровня обслуживания c и сгенерируйте новый UUID.
  3. Установите статус строки, выбранной на шаге 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 решение проблемы, пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...