Я не знаю, как правильно сформулировать мой вопрос. Но чтобы представить более подробную информацию о проблеме, которую я пытаюсь решить, позвольте мне описать мою заявку. Предположим, я пытаюсь реализовать приложение для резервирования очереди и примерно поддерживаю количество слотов в таблице.
id | appointment | slots_available | slots_total
---------------------------------------------------
1 | apt 1 | 30 | 30
2 | apt 2 | 1 | 5
.. | .. | .. | ..
Итак, в конкурентном сценарии, предполагая, что все работает на стороне приложения вещей. Сценарий может произойти в приложении, где:
user 1 -> reserves apt 2 -> [validate if slot exists] -> update slot_available to 0 -> reserve (insert a record)
user 2 -> reserves ap2 2 -> validate if slot exists -> [update slot_available to 0] -> reserve (insert a record)
Что если пользователь 1 и 2 обнаружат слот , доступный для apt2 одновременно в интерфейсе пользователя? (Конечно, я бы сначала проверил, если есть один слот, но они увидят то же значение в пользовательском интерфейсе, если еще ни один из них не нажал). Затем оба подают резервирование одновременно.
А что если пользователь 1 проверит наличие доступного слота, даже если пользователь 2 уже воспользовался им, хотя операция обновления еще не завершена? Тогда будет две вставки .
В любом случае, как мне обеспечить, чтобы только один из них получил резервирование на уровне базы данных ? Я уверен, что это распространенный сценарий, но я пока не знаю, как реализовать что-то подобное. Предложение о переделке также будет приемлемым, если оно решает сценарий.