Как синхронизировать значения ячеек в одной таблице?

Большая проблема…

Я внедряю систему онлайн-продажи билетов на PHP и MySQL. У меня есть таблица с именем «block_of_tickets» или что-то в этом роде …

Эта таблица выглядит так:

+-----------+------------+--------------+--------------+--------------+
| idblock | имя_блока | total_tickets | block_gender | idblock_pair |
+ ----------- + ------------ + -------------- + --------- ----- + -------------- +
| 1 | Блок 1- М | 100 | МУЖЧИНА | 2 |
+ ----------- + ------------ + -------------- + --------- ----- + -------------- +
| 2 | Блок 1- F | 100 | ЖЕНЩИНА | 1 |
+ ----------- + ------------ + -------------- + --------- ----- + -------------- +

Куда:

  1. idblock: Идентификатор (первичный ключ) блока билетов.
  2. block_name: Название блока. В этом примере у меня есть «Блок 1-М» и «Блок 1-F» для представления «Блок 1 — Мужской» и «Блок 1 — Женский», соответственно.
  3. total_tickets: общее количество доступных билетов
  4. block_gender: пол блока билетов
  5. idblock_pair: блок, который является парой текущего блока.

Примечание: есть и другие столбцы, такие как «цена» и т. Д.

Вот (большая) проблема:

  1. Когда есть «idblock_pair«, это означает, что оба блока билетов будут использовать одни и те же total_tickets (доступные билеты), поэтому в этом случае обе ячейки должны иметь одинаковое значение. Как вы можете видеть в приведенном выше примере, блок 1 указывает на блок 2 и наоборот.

  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;

Это хорошее решение?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …