У нас есть таблица CARD, в которой хранится номер карты и номер учетной записи пользователя. Только максимум два пользователя могут использовать одну и ту же карту. Это ограничение не реализовано как ограничение SQL для таблицы, а наложено в код следующим образом.
Когда пользователь пытается добавить карту -
- проверить, существует ли номер карты в БД. Готово, запросив таблицу с номером карты.
- Если нет записей, значит, это новая карта. Добавить запись.
- Если уже есть записи -
если нет записей меньше 2 - добавьте запись в таблицу для этого пользователя. <тот же номер карты, этот номер учетной записи пользователя>
если оно равно 2 - предел достигнут, и мы не можем добавить эту карту этому пользователю. Итак, код выдаст ошибку.
Теперь проблема:
Предположим, что 100 пользователей пытаются добавить одну и ту же карту одновременно. Эта карта раньше не существовала в БД. Произойдет следующее.
100 запросов (один запрос для каждого пользователя) обрабатываются в 100 потоках. Каждый поток увидит, что номер карты отсутствует в таблице -> нет. количество пользователей, добавивших эту карту, равно 0, что меньше лимита, т.е. 2. Итак, каждый поток попытается вставить запись в таблицу. В итоге у нас в таблице будет 100 пользователей, использующих одну и ту же карту.
user 1,card number - thread 1
user 2,same card number - thread 2
user 3, same card number - thread 3.
......
....
user 100, same card number - thread 100
Мы хотели, чтобы только 2 пользователя могли делиться картой, но наш общий предел карты теперь превышен. Как справиться с этим сценарием?
Один очевидный ответ - синхронизация вставки записи в БД. Но это приводит к следующей проблеме.
Предположим, 100 пользователей пытаются добавить 100 разных номеров карт. Если мы синхронизируем операцию вставки, когда один запрос пытается вставить запись в таблицу, все остальные запросы будут оставаться в ожидании-> Время ответа для API
сильно бьется Но в этом случае нет необходимости делать это, потому что комбинация пользователя и номера карты различна для каждого запроса. Таким образом, этот вариант исключен. Какие варианты у нас остались?