Параллельные вставки и состояние гонки в MySQL - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть случай, когда я должен ограничить количество строк на пользователя в таблице.Теперь я делаю это с помощью COUNT * FROM table проверки перед вставкой, и если число равно / больше, чем разрешено, я выдаю ошибку.Запрос COUNT и INSERT выполняется в одной транзакции.Но на 5000 онлайн-пользователей и 50 000 запросов в минуту у меня есть дополнительные записи (больше, чем лимит) в таблице.Похоже на состояние гонки на параллельных вставках.Как я могу избежать этого?Кто-нибудь может предложить несколько лучших практик?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Проблема называется Фантомное чтение .Обычно это можно решить с помощью Сериализуемый уровень изоляции транзакции:

https://en.wikipedia.org/wiki/Isolation_(database_systems)

Но это может снизить производительность.Поэтому, если у вас много вставок, попробуйте другие варианты из комментариев.

0 голосов
/ 25 сентября 2018

Используйте отдельную таблицу, которая будет поддерживать пользователя и количество вставленных строк.Используйте идентификатор пользователя в качестве внешнего ключа к основной таблице.Теперь, если у вас есть приложение на основе сеанса, вы можете загрузить данные в сеанс или память и продолжать их выборку / обновление счетчика после каждой вставки в сеанс / память и базу данных, а затем фактически вставлять в основную таблицу.

...