Вероятно, стоит повторно посетить ваш дизайн:
Остальные места - это общее количество мест за вычетом забронированных мест.
Этот номер действителен только в определенный момент времени, так какизменение количества забронированных мест.
Чтобы забронировать место, вы совершаете транзакцию: пользователь сообщает, что хочет забронировать одно или несколько мест, обрабатывает регистрацию и, наконец, бронирует (или нет).
Пока эта транзакция не была завершена, количество оставшихся мест, которое вы можете рассчитать, вероятно, неверно.
У вас есть два варианта:
- РазрешающийБлокировка
- Оптимистическая блокировка
В первом случае каждый раз, когда пользователь запускает транзакцию и сообщает приложению, что места X должны быть забронированы, эти места X блокируются.Это не означает, что эти места уже забронированы, они просто заблокированы, поэтому у пользователя есть достаточно времени для завершения транзакции бронирования.Если транзакция заканчивается, эти заблокированные места резервируются пользователем.
Со вторым, Оптимистическая блокировка пользователь только начинает регистрироваться, но ничего не блокируется.В конце транзакции бронирования транзакция может завершиться неудачей, если больше не будет доступно достаточно мест.
Разрешающая блокировка может помешать некоторым пользователям подписаться до начала транзакции - даже если они могут сделать это через день - ОптимистичноБлокировка может помешать некоторым пользователям подписаться в конце транзакции.
Вам необходимо выяснить, что лучше всего подходит для вашего случая.Обычно оптимистическая блокировка более приятна для пользователей (так как только некоторые из них заканчиваются неудачей в конце), однако разрешительная блокировка поможет вам не расстраивать пользователей в конце транзакции.Если на билетах всегда есть пробежка, возможно, лучше использовать разрешительную блокировку.
Вы можете подумать о том, как сделать вещи менее разочаровывающими для пользователей, введя юзабилити в игру.Например, с оптимистической блокировкой, каждая страница в транзакции может иметь счетчик оставшихся AJAX сверху, показывающий текущее количество оставшихся мест, поэтому вы можете заранее сообщить пользователям, если места закончились.Таким образом, даже если они уже что-то вложили в формы, они могут видеть, насколько удачливы (или достаточно быстры) они в своих действиях.
Я бы не стал ограничивать время регистрации пользователей между прочим. Это создает стрессна пользователя.С оптимистичной блокировкой и баром AJAX пользователи будут в достаточной степени напряжены, если места закончатся.Просто вашей системе не нужно заботиться о регистрации.
Если вы хотите разрешить регистрацию с душевным спокойствием, вам нужно выбрать разрешающую блокировку.Затем вам нужно время ожидания, но я бы сделал это для каждого действия пользователя, поэтому, если пользователь активен, время ожидания будет продлено еще на 15 минут до завершения.Я бы выбрал здесь высокое значение, чтобы не разочаровывать пользователя в получении тайм-аута.
Для тех пользователей, которые хотят зарегистрироваться, когда все доступные места заблокированы транзакциями регистрации, вы должны предложить бэк-лист иСообщите пользователям, что в настоящее время места X заблокированы с помощью регистраций, но им, возможно, повезет, если они получат другое место позже.Или вы разрешаете перебронировать количество заблокированных мест, чтобы эти пользователи были поставлены в очередь в случае, если другой пользователь не завершил свою транзакцию успешно.
Кстати, дизайн базы данных должен отражать процедуру, которую вы определили заранее, я неЯ думаю, что вы столкнетесь с реальными проблемами здесь, пока знаете, чего пытаетесь достичь.Поскольку все делается в торговых операциях, вы можете даже вести простой подсчет для каждого события общего, забронированного и заблокированного места.Это один простой запрос, нет необходимости в агрегировании, как при COUNT(*)
.Также могут быть полезны триггеры и хранимые процедуры.