То, что вы описываете, представляет собой тип ситуации race condition
и способ ее решения зависит от бизнес-логики c. Например, при наличии товара, которого нет в наличии, сначала вам необходимо решить, хотите ли вы автоматически сделать заказ товара или вы хотите отменить покупку.
Если вы хотите отменить покупку, вы нужно использовать какой-то тип базы данных locking
механизм. Блокировка может заблокировать доступ к таблице базы данных или запись на мгновение. Идея состоит в том, что вы блокируете биржевую информацию в начале процесса исполнения и разблокируете ее только после того, как покупка была обработана.
Когда запрос базы данных встречает блокировку, он будет ждать, пока блокировка не будет снята, продолжить операцию (или до истечения времени ожидания). Таким образом, запрос, который получает блокировку первым, является первым, который может завершить sh покупку.
Но одной блокировки может быть недостаточно, чтобы предотвратить несоответствия, которые вы хотите выполнить внутри базы данных. а database transaction
. Транзакция может гарантировать, что все операции, необходимые для обработки покупки, выполнены успешно, в противном случае все откатывается. Например, использование транзакций может помешать вам обновить количество на складе без фактического завершения покупки.
Цель состоит в том, чтобы, когда два запроса приходились на почти одновременно (поскольку ничего не происходит в в то же время) один из них сначала получит блокировку, а затем завершит sh и commit
транзакцию покупки. Когда второй запрос, наконец, получит шанс на обработку, запас будет равен нулю, транзакция завершится неудачно и произойдет roll-back
(учитывая, что вы выполнили правильные проверки).
Специфические c запросы и проверки, которые вам нужны, варьируются от приложения к приложению, но применяются одни и те же понятия. В вашем случае у нас нет каких-либо подробностей, которые помогут вам в дальнейшем, поэтому я предлагаю вам проверить предоставленные ссылки, чтобы собрать больше информации.
Удачи!