Что произойдет, если два или более запроса поступят одновременно? - PullRequest
0 голосов
/ 15 марта 2020

Я сольный разработчик и фрилансер, у меня в городе есть простой проект электронной коммерции.

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

Я знаю, что этот вопрос кажется глупым, но подумайте о другом проекте в другом сценарии, когда я создаю случайное веб-приложение в чате, а не то, как будет влиять состояние. Если человек в сети и ни с кем не общается, как сопоставить аккаунты.

Я пытался что-то для этого, но это не сработало. У меня 3 компьютера 2 P C и один ma c Я пытаюсь сделать запрос одновременно, но из-за скорости inte rnet только один может разместить заказ, а другой получить сообщение о неисправности через 2 минуты. Так что же происходит, если скорость была одинаковой.

Нужно ли мне добавлять какие-либо алгоритмы, которые будут размещать заказ человека, и в то время другой человек удерживает этот заказ. Я гуглил, но ничего не нашел. И, как я уже говорил, я сольный разработчик, поэтому нет никого, кто бы спросил, что делать, или MySql справится с этим.

О, если вы думаете сделать проект такого рода с WordPress или фреймворком наподобие laravel. Я также согласен с вами, но клиент сказал использовать только простой язык программирования, даже не библиотеку.

Спасибо за чтение.

Ответы [ 2 ]

3 голосов
/ 15 марта 2020

То, что вы описываете, представляет собой тип ситуации race condition и способ ее решения зависит от бизнес-логики c. Например, при наличии товара, которого нет в наличии, сначала вам необходимо решить, хотите ли вы автоматически сделать заказ товара или вы хотите отменить покупку.

Если вы хотите отменить покупку, вы нужно использовать какой-то тип базы данных locking механизм. Блокировка может заблокировать доступ к таблице базы данных или запись на мгновение. Идея состоит в том, что вы блокируете биржевую информацию в начале процесса исполнения и разблокируете ее только после того, как покупка была обработана.

Когда запрос базы данных встречает блокировку, он будет ждать, пока блокировка не будет снята, продолжить операцию (или до истечения времени ожидания). Таким образом, запрос, который получает блокировку первым, является первым, который может завершить sh покупку.

Но одной блокировки может быть недостаточно, чтобы предотвратить несоответствия, которые вы хотите выполнить внутри базы данных. а database transaction. Транзакция может гарантировать, что все операции, необходимые для обработки покупки, выполнены успешно, в противном случае все откатывается. Например, использование транзакций может помешать вам обновить количество на складе без фактического завершения покупки.

Цель состоит в том, чтобы, когда два запроса приходились на почти одновременно (поскольку ничего не происходит в в то же время) один из них сначала получит блокировку, а затем завершит sh и commit транзакцию покупки. Когда второй запрос, наконец, получит шанс на обработку, запас будет равен нулю, транзакция завершится неудачно и произойдет roll-back (учитывая, что вы выполнили правильные проверки).

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

Удачи!

0 голосов
/ 15 марта 2020

Есть счетчик для отслеживания количества оставшихся предметов в базе данных. При оформлении заказа примените WRITE LOCK к таблице перед обновлением количества доступных предметов. Это было два запроса не могут обновить таблицу одновременно.

https://www.mysqltutorial.org/mysql-table-locking/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...