![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Zastanawiam sie czy 2 skrypty php mogą zacząć wykonywać się równolegle? Przy jednym procesorze to chyba niemożliwe prawda? A co jeśli serwer jest wieloprocesorowy? Czy wtedy mogą wykonywać się obok siebie?
Czy jeśli nie wykonują się równolegle to po co korzystać z LOCK TABLES? -------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 441 Pomógł: 71 Dołączył: 3.09.2007 Skąd: wrocław Ostrzeżenie: (0%) ![]() ![]() |
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
![]() -------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem, dlaczego jeden procesor miałby być przeszkodą. W jaki sposób pisałeś tego posta, jednocześnie słuchając muzyki, mając otwarty komunikator, edytor kodu i ściągając coś w tle? Twój komputer miał 5 procesorów czy jeden? Wielozadaniowość realizowana jest poprzez szybkie, niezauważalne dla człowieka, przełączenia między poszczególnymi zadaniami realizowane przez system operacyjny. PHP nie jest jakimś magicznie, szczególnie wyróżnionym programem, że w jego przypadku ta zasada nie obowiązuje. Jeśli FastCGI będzie mieć aktualnie pięć procesów PHP odpalonych, to w tym samym czasie mniej więcej może wykonywać się pięć skryptów. Jeśli Apache utworzy pięć wątków do obsługi żądań HTTP wymagających wykonania skryptu PHP, to one też się będą wykonywać równolegle. Nie jest to wprawdzie rzeczywista równoległość, bo w danym momencie wykonywane jest jedno zadanie, ale dzięki tym właśnie przełączeniom proces wykonywania wszystkich pięciu skryptów postępuje jednocześnie.
Co więcej, obecne procesory rzadko kiedy posiadają tylko jeden rdzeń - normą są dwa, a często spotkać już można i cztery. Jeśli system operacyjny przyporządkuje dwa skrypty do różnych rdzeni, będziesz mieć prawdziwą równoległość na jednym procesorze. Tak więc używanie LOCK TABLES zawsze jest zasadne, bo nie żyjemy w czasach systemu CP/M i DOS-a, gdzie naraz mógł być uruchomiony tylko jeden program. A tak w ogóle to lepiej używać transakcji - dają to samo, co blokowanie, wymagają mniej zachodu i w razie wykrzaczenia się skryptu lub bazy w połowie transakcji wszystkie wprowadzone przez nią zmiany są natychmiast cofane. -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
![]() No chyba, że chodzi Ci o "równoległe działanie" polegające na tym, że w 2 oknach przeglądarki wpiszesz ten sam adres ![]() |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Rozumiem że programy wykonują się równolegle. Nie byłem tylko pewny jak to się ma do styku Baza/Aplikacja. Jak więc równoległy proces PHP reaguje np na TABLE LOCK? Ustawia się w kolejce i czeka aż tabela się zwolni czy zaprzestaje odczytu lub zapisu do bazy?
Druga sprawa jaka mnie martwi to czy powinno się ustawiać LOCK na tabeli przed rozpoczęciem transakcji? Obawiam się o bazę mySQL która ostatnio mi się wykrzaczyła z niewyjaśnionych przyczyn. Ten post edytował Black-Berry 4.03.2009, 13:29:33 -------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
PHP reaguje w ten sposób, że wysyła to zapytanie do bazy i jak baza każe mu czekać, to czeka, jako że w kodzie objętym blokadą zapisu może być tylko jeden wątek naraz (ten, który blokadę nałożył). W przypadku transakcji stosowanie blokowania nie jest konieczne. Bazy danych zezwalają nawet na równoległe wykonywanie się dwóch transakcji operujących na tych samych danych - nie pamiętam teraz dokładnie, która transakcja wygrywa, ale któraś wygrywa i jest "akceptowana", zaś pozostałe są anulowane. Jeśli natomiast dane ze sobą nie kolidują, obie transakcje przechodzą.
Ogólnie transakcje to najpewniejszy sposób zapobiegania powstawaniu nieścisłości w bazie danych z powodu tego, że jakaś grupa zapytań nie wykonała się poprawnie do końca. Zostały one tak zaprojektowane, by takim sytuacjom zapobiegać. Niestety, w przypadku MySQL-a do ich stosowania jest niezbędne użycie InnoDB zamiast MyISAM. -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Druga sprawa jaka mnie martwi to czy powinno się ustawiać LOCK na tabeli przed rozpoczęciem transakcji? Obawiam się o bazę mySQL która ostatnio mi się wykrzaczyła z niewyjaśnionych przyczyn. Według mnie to baza danych powinna o to zadbać. Jeśli robisz kilka SELECT'ów, to wykonują się one po kolei. Jeśli wysyłasz na raz dwa zapytania, np. INSERT i SELECT, to baza danych zadba o to, żeby podczas operacji INSERT tabelka była zablokowana. Czyli zapytanie SELECT wykona się chwilkę później. Dla Ciebie, jako programisty PHP nie ma to zbytniego znaczenia, bo Ty wysyłasz zapytanie i czekasz na odpowiedź z wynikiem. Jeśli nabredziłem, to mnie poprawcie. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Zyx Dzieki za wyczerpującą odpowiedź. Trochę mnie to uspokoiło.
Acha... piszesz że któraś transakcja wygrywa a pozostałe są anulowane... Czy jeśli nałożę LOCK przed transakcją to mam pewność że żadna nie zostanie anulowana bo będą poprostu czekać w kolejce ? Bardzo bym nie chciał żeby jakaś transakcja była anulowana bez mojej wiedzy tylko dlatego że weszłą drugiej w drogę z powodu wielowątkowości skryptów PHP. Chciałbym aby baza najpierw kazała czekać nowym transakcjom a dopiero w ostateczności dokonywała anulowania. Ten post edytował Black-Berry 4.03.2009, 14:04:51 -------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Bez Twojej wiedzy to się tak znowu nie dzieje - skrypt dostaje wtedy stosowną informację i może zareagować
![]() Oczywiście w przypadku sekcji krytycznych można zablokować całą tabelę przed wejściem w transakcję, nie ma przeciwko temu żadnych przeciwwskazań - oznacza to, że blokowanie oraz transakcje mogą się uzupełniać, jeśli zachodzi potrzeba. -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 55 Pomógł: 4 Dołączył: 19.05.2003 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
dodam tylko ze tabele moga byc blokowane np. wylacznie do zapisu, wiec zaden select z innego wątku nie zostanie zablokowany.
ja mialem z tym LOCKiem problem kiedy potrzebowalem dodatkowej kolumny z warunkowym auto_increment wyliczanym na podstawie istniejacych rekordow. kilku uzytkownikow mi zglaszalo ze dostawali errory z mysql'a kiedy chcieli zapisywac cos do bazy. jak zmienilem na "LOCK TABLE $db_table WRITE" to bledow jest mniej, ale dalej sporadycznie sie zdarzaja... Ten post edytował Orkan 5.03.2009, 00:24:41 -------------------- The fastest app with PHP: <?php die('Hello World'); ?>
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Orkan Czy nie miałeś czegoś zle zaprojektowanego? Moim zdaniem błędy nie powinny sie zdarzać nigdy.
-------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 55 Pomógł: 4 Dołączył: 19.05.2003 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Pewnie mozna by cos ulepszyc i sprawdzac przed zapisem czy tabela jest potraktowana LOCKiem czy nie.
Mowie tylko, ze w moim przykladzie (tabela MyISAM) PHP nie czeka az tabela zostanie odblokowana, tylko wywala normalnego errora ze nie mozna zapisac... -------------------- The fastest app with PHP: <?php die('Hello World'); ?>
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
No to w takiem razie mamy nieścisłość w stosunku do tego co napisał Zyx. Bardzo mnie to martwi :|
-------------------- http://www.berry.nazwa.pl/edico/public_html/index.php ----> under construction
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.06.2025 - 21:50 |