PostgreSQL - Как предотвратить дублирование вставок в конкурсе на участие в слоте - PullRequest
0 голосов
/ 30 октября 2018

Я не знаю, как правильно сформулировать мой вопрос. Но чтобы представить более подробную информацию о проблеме, которую я пытаюсь решить, позвольте мне описать мою заявку. Предположим, я пытаюсь реализовать приложение для резервирования очереди и примерно поддерживаю количество слотов в таблице.

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 уже воспользовался им, хотя операция обновления еще не завершена? Тогда будет две вставки .

В любом случае, как мне обеспечить, чтобы только один из них получил резервирование на уровне базы данных ? Я уверен, что это распространенный сценарий, но я пока не знаю, как реализовать что-то подобное. Предложение о переделке также будет приемлемым, если оно решает сценарий.

...