Тут беруть участь щонайменше 2 бізнес-процеси.
Показати наявні місця.
Забронюйте вибране місце.
Оскільки ці процеси не слідують один одному нескромно, і оскільки 2 людини можуть обрати одне місце, виникає проблема одночасності.
Якщо дизайн вашої бази даних призначає правильне обмеження унікальності, так що комбінація:
-ТеатрID
-SeatID
-EventID
є унікальними, тоді база даних запобіжить дублювання.
Наступний сценарій також можливий, але буде вирішено вищезапропонованою реалізацією:
Припускаючи вигляд сітки, доступного для певного театру та даної події, може бути відображено:
- User1 відображає доступні місця (і отримує місця 1 і 2)
- User2 відображає доступні місця (і отримує місця 1 і 2)
- User1 трохи спілкується з клієнтом по телефону
- User2 йде та бронює місце 2 для свого замовника
- Користувач1 намагається забронювати місце для свого замовника 2 (оскільки це відображається як наявне на його екрані)
- Унікальний індекс перешкоджає кроку 5 коммутувати дані.
Отже, все, що вам потрібно зробити, може бути не більш правильним дизайном бази даних та правильним вибором обмежень.
Інші більш складні підходи можливі, якщо ви хочете, використовуючи черги транзакцій. У цьому випадку запити записуються спочатку до черги, а потім запускається процес кожні n секунд, але це навряд чи є необхідним або практичним у вашому випадку.
Дійсно цікава частина - що має показувати сітка списку для користувача 1?