Jestem samodzielnym programistą i freelancerem, mam prosty lokalny projekt e-commerce w moim mieście.

Opracowałem cały kod w PHP MySQL i innych technologiach front-end. Ale pomyślałem, co się stanie, jeśli zostanie tylko jeden przedmiot, a dwie lub więcej osób zamawia ten sam przedmiot w tym samym czasie. Użyłem algorytmu, jeśli produkt jest niedostępny, wtedy zamówienie będzie pandingowane lub poproszę klienta o anulowanie projektu, aby klient musiał anulować swój projekt lub który klient powinien złożyć zamówienie.

Wiem, że to pytanie wydaje się głupie, ale pomyśl o innym projekcie w innym scenariuszu, kiedy zrobię przypadkową aplikację internetową do czatowania, to jak wpłynie to na stan. Jeśli osoba jest online i nie rozmawia z nikim, jak dopasować konta.

Próbowałem czegoś do tego, ale nie zadziałało. Mam 3 komputery, 2 PC i jeden Mac, próbuję wysłać zapytanie w tym samym czasie, ale ze względu na szybkość internetu tylko jeden mógł złożyć zamówienie, a inni otrzymali wiadomość o niesprawności po 2 minutach. Więc co się stanie, jeśli prędkość będzie taka sama.

Czy muszę dodawać jakikolwiek algorytm, który będzie porządkował osobę, a w tym czasie inna osoba będzie odpowiadać za to zamówienie. Szukałem w Google, ale nic nie znalazłem. I jak powiedziałem wcześniej, jestem samodzielnym programistą, więc nie ma nikogo, kto mógłby zapytać, co robić, inaczej MySql sobie z tym poradzi.

Och, jeśli myślisz o stworzeniu tego rodzaju projektu za pomocą WordPress lub frameworka takiego jak laravel. Zgadzam się z tobą, ale klient powiedział, że używa tylko prostego języka programowania, a nawet biblioteki.

Dziękuję za przeczytanie .

1
Kiran Patel 15 marzec 2020, 15:18

2 odpowiedzi

Najlepsza odpowiedź

To, co opisujesz, to race condition sytuacja i sposób, w jaki sobie z nią radzisz zależy od logiki biznesowej. Na przykład w przypadku produktu, którego nie ma w magazynie, najpierw musisz zdecydować, czy chcesz automatycznie zamówić produkt z powrotem, czy też chcesz przerwać zakup.

Jeśli chcesz przerwać zakup, musisz użyć jakiejś bazy danych locking mechanizm. Zablokowanie może chwilowo zablokować dostęp do tabeli bazy danych lub rekordu. Chodzi o to, że blokujesz informacje o zapasach na początku procesu realizacji i odblokowujesz je dopiero po przetworzeniu zakupu.

Gdy żądanie bazy danych napotka blokadę, będzie czekać, aż blokada zostanie zwolniona, aby kontynuować operację (lub do przekroczenia limitu czasu). Tak więc żądanie, które jako pierwsze otrzymuje blokadę, jest pierwszym, które ma szansę dokończyć zakup.

Jednak samo blokowanie może nie wystarczyć, aby zapobiec niespójnościom, które chcesz wykonywać wszystkie operacje na bazie danych w {{X0} }. Transakcja może zapewnić pomyślne przeprowadzenie wszystkich operacji niezbędnych do przetworzenia zakupu, w przeciwnym razie wszystko zostanie wycofane. Na przykład użycie transakcji może uniemożliwić aktualizację stanu zapasów bez faktycznego zakończenia zakupu.

Celem jest to, że gdy dwa żądania przychodzą prawie w tym samym czasie (ponieważ nic nie dzieje się w tym samym czasie), jedno z nich zostanie najpierw zablokowane, a następnie zakończy i commit transakcja zakupu . Kiedy drugie żądanie w końcu będzie mogło zostać przetworzone, to stan będzie wynosił zero, a transakcja zakończy się niepowodzeniem i nastąpi roll-back (zakładając, że wykonałeś odpowiednie kontrole).

Konkretne zapytania i sprawdzenia, których potrzebujesz, różnią się w zależności od aplikacji, ale obowiązują te same pojęcia. W Twoim przypadku nie mamy żadnych szczegółów, które poprowadziłyby Cię dalej, więc sugeruję sprawdzenie podanych linków, aby zebrać więcej informacji.

Powodzenia!

3
fromvega 15 lipiec 2020, 14:34

Posiadaj licznik do śledzenia pozostałej liczby przedmiotów w bazie danych. Przy składaniu zamówienia zastosuj BLOKADĘ ZAPISU do tabeli przed aktualizacją liczby dostępnych pozycji. To były dwa żądania, które nie mogą zaktualizować tabeli naraz.

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

0
dryize 15 marzec 2020, 13:08