Большая проблема…
Я внедряю систему онлайн-продажи билетов на PHP и MySQL. У меня есть таблица с именем «block_of_tickets» или что-то в этом роде …
Эта таблица выглядит так:
+-----------+------------+--------------+--------------+--------------+ | idblock | имя_блока | total_tickets | block_gender | idblock_pair | + ----------- + ------------ + -------------- + --------- ----- + -------------- + | 1 | Блок 1- М | 100 | МУЖЧИНА | 2 | + ----------- + ------------ + -------------- + --------- ----- + -------------- + | 2 | Блок 1- F | 100 | ЖЕНЩИНА | 1 | + ----------- + ------------ + -------------- + --------- ----- + -------------- +
Куда:
Примечание: есть и другие столбцы, такие как «цена» и т. Д.
Вот (большая) проблема:
Когда есть «idblock_pair«, это означает, что оба блока билетов будут использовать одни и те же total_tickets (доступные билеты), поэтому в этом случае обе ячейки должны иметь одинаковое значение. Как вы можете видеть в приведенном выше примере, блок 1 указывает на блок 2 и наоборот.
Многие люди покупают много билетов в одно и то же время, что означает, что каждый проданный билет должен уменьшаться на 1 в поле «total_tickets» для обеих ячеек.
Нормализация базы данных может решить эту проблему. Однако, это сильно потеряло бы в производительности.
Я почти уверен, что должен использовать «SELECT … FOR UPDATE» … но я не знаю как, поскольку это та же самая таблица, и может произойти «тупик» …
Как решить эту проблему? Должен ли я использовать триггеры? Proccedures? Должен ли я использовать обработку PHP (и транзакции), чтобы решить эту проблему?
В приведенном ниже примере один билет был продан, и теперь я уменьшаю total_tickets по 1:
НАЧАТЬ СДЕЛКУ; ВЫБРАТЬ * FROM block_of_tickets ГДЕ idblock в (1,2) ДЛЯ ОБНОВЛЕНИЯ; ОБНОВЛЕНИЕ block_of_tickets SET total_tickets = (total_tickets - 1) ГДЕ идблок в (1,2); COMMIT;
Это хорошее решение?
Задача ещё не решена.
Других решений пока нет …