2013-02-22 20 views
5

Byłem ciekawy jak zachowują się skrypty PHP i MySQL? Skrypt to w zasadzie dwa zapytania SQL.Co się dzieje, gdy skrypt PHP uzyskuje dostęp do bazy danych MySQL w tym samym czasie, więcej niż raz?

Pierwsza WYBIERA i pobiera numer z kolumny określonego wiersza ustalonej przez jakiś identyfikator.

Następnie, jeśli liczba jest dodatnia, druga AKTUALIZUJE kolumnę, odejmując określoną kwotę.

Oczywiście jest to klasyczny przypadek, w którym będę używał transakcji lub blokady lub muteksów lub tego, co dalej.

Moje pytania to: na stronie internetowej jest całkowicie możliwe dla dwóch lub więcej użytkowników, aby wywołać skrypt w tym samym czasie w tym samym wierszu. Jeśli nie używasz transakcji lub blokowania tabel, jak PHP to przetworzy? Są to dwa zapytania/wywołania funkcji, ale są one w jednym skrypcie. Czy czeka cały skrypt, aby powrócić do odpowiadającego mu użytkownika, aby uruchomić go ponownie dla innego użytkownika, lub ponieważ są to różne zapytania z powodu pseudoparallelizmu, może uruchomić pierwsze zapytanie dla wielu użytkowników wywołujących ten sam skrypt, a następnie drugi dla innego zestawu.

Zasadniczo pytam, ponieważ robię coś, gdy nie mam wystarczających uprawnień do korzystania z transakcji lub zamków i chcę wiedzieć, czy mogę uniknąć muteksu (nie jestem pewien co do tego słowa, w zasadzie nowa tabela dla dzwoniących, przed wywołaniem powyższego skryptu wezwę nowy skrypt przed tym, w którym obrócę kolumnę boolowską tabeli, tak aby inni ludzie nie mogli przejść do oryginalnego skryptu, a potem do faksu, aby następny był zgodny może zrobić i tak dalej)

Edycja: Nie jestem pewien, czy wybrać aktualizację, czy uprawnienia do tego są zawarte w wyżej wymienionych. Faceta odpowiedzialnego za udzielanie odpowiedzi na moje pytania jest trudny do znalezienia, a ja miałem go ze sobą szukając ...

Odpowiedz

1

To bardzo dziwne, że możesz zrobić aktualizację, ale nie możesz zablokować tabeli (aktualizacja to blokada dla niektórych silników i blokowanie wierszy dla innych). Ale jeśli naprawdę nie możesz zablokować w ten sposób, możesz użyć get_lock function. Działa jak mutex.

P.S. Jeśli używasz aktualizacji tylko z przypisaniem (set a=10), możesz utracić część danych. Jeśli używasz zadania z referencją do złożonego (set a=10+a), to nigdy się nie stanie.

+0

Tak, dostałem odpowiedź, że mogę zablokować stoły ... więc miałeś rację. Jeśli chodzi o P.S, to właśnie robię; za pomocą odniesienia na kolumnie (free = free - {$ diff}) –

+0

Teraz wiem, że mogę użyć SELECT ... FOR UPDATE. Czy wiesz, jak to działa. Sposób, w jaki to zrozumiałem, blokuje wiersze wyniku (z kwerendy wyboru) zarówno dla odczytu (wybierz) i zapisu (aktualizacja), ale nie jestem pewien, kiedy je zwalnia ... Po następnej aktualizacji tych wierszy? –

+1

SELECT ... FOR UPDATE działa tylko w transakcjach. Zablokuje wiersze do końca transakcji. – sectus

0

Nie możesz tego zrobić w jednym wywołaniu, w ten sposób nie będzie to miało większego znaczenia?

UPDATE T1 
    SET T1.COLUMN = T2.COLUMN - 4 
    FROM TABLE1 AS T1 
    INNER JOIN TABLE2 AS T2 
     ON T1.COLUMN = T2.COLUMN 
    WHERE T2.COLUMN = ID 
    AND T2.COLUMN > 0 
+0

naprawdę bardzo uproszczony proces, ponieważ na podstawowe pytanie nie trzeba znać szczegółów skryptu. Wystarczy powiedzieć, że już o tym pomyślałem i byłoby to bardzo duże i skomplikowane zapytanie. Dziękuję za chociaż :) –