Мы используем MySQL InnoDB. Система поддерживает несколько запросов, которые могут выполняться одновременно. Вот упрощенный пример того, чего мы пытаемся достичь. Предположим, у нас есть таблица, содержащая объекты, представляющие лампочку. Эти лампочки могут быть включены (активированы) пользователями. Пользователи могут добавлять в таблицу лампочки, которые изначально дезактивированы, и только 10 из них могут быть отмечены как активированные. Таким образом, у нас есть предел 10. Поскольку система поддерживает параллелизм, существует риск гонки условия основаны на следующем примере:Как избежать состояния гонки в MySQL InnoDB?
СЕССИЯ 1:
1: Получить количество активных лампы
2: Проверьте количество активированных ламп
3: Если предел еще не достигнут, активируйте лампу и зафиксируйте ее.
4: В противном случае откат.
Проблема в том, что во время шагов 2 и 4 другая сессия могла войти и могла превысить предел.
Это SQL представление того, что мы делаем в данный момент:
- SELECT COUNT (ID) AS Всего с ТПС WHERE is_active = 1;
- if (всего < 10) {
- активировать другую лампочку; } else {
- откат; }
Что вы рекомендуете в качестве решения для этого сценария? Мы рассматривали возможность «выбрать для обновления», но если я не ошибаюсь, блокирует выбранные строки, и пользователи могут добавлять луковицы в таблицу, в то время как выбранные строки находятся под блокировкой.
спасибо.
Вам нужно «активировать» лампу или делать _absolutely nothing_? Заметьте, даже сообщите пользователю, что он больше не может «активировать»? (Я чувствую, что постановка проблемы неполна.) –