![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 158 Pomógł: 0 Dołączył: 9.01.2005 Ostrzeżenie: (0%) ![]() ![]() |
Chciałbym rozwiać moje wątpliwości co do pewnego tematu. Mianowicie chciałbym się dowiedzieć jak to jest ze skryptami php nawiązującymi połączenie z bazą danych i wykonującą szereg zapytań. Dajmy na to mamy taki o to kod:
Czy jest szansa aby pierwszy zwrócony wynik różnił się od drugiego? Innymi słowy czy pomiędzy wykonywane zapytania do bazy danych przez skrypt php mogą wbić się inne zapytania wykonywane np. przez inny skypt? Czy może się zdażyć tak, że podlicze sobie rekordy i wyjdzie mi powiedzmy 30 a gdy spróbuje wykonać na nich jakąś operacje to może mi sypnąć błędem bo np. inny skrypt je w tym czasie usunął? Do tej pory myślałem, że tak to nie działa. Ktoś mi tam kiedyś mówił, że jest to nie możliwe bo baza jest blokowana na czas połączenia ale dziś przy okazji dokształcania się czytam sobie o pdo i natrafiłem na funkcję "PDO->beginTransaction()", "PDO->commit()" i "PDO->rollBack()" które o ile dobrze zrozumiałem mają właśnie służyć blokowaniu takiej możliwości (no i jeszcze dodaje możliwoś cofnięcia zmian). Może jednak się mylę. Bardzo proszę o odpowiedź i rozwianie moich wątpliwości jak to faktycznie działa. |
|
|
![]() |
![]() ![]()
Post
#2
|
|
Administrator serwera Grupa: Developerzy Postów: 521 Pomógł: 13 Dołączył: 2.04.2004 Skąd: 52°24' N 16°56' E Ostrzeżenie: (0%) ![]() ![]() |
@xamil:
Ad. 1 Coś takiego było również w PHP4, ponieważ tranzakcje to nie jest element składni PHP tylko jest to element języka SQL:
Ad. 2 Patrz kod powyżej, jak można to zrobić z poziomu PHP i wtedy aplikacja nie musi się tym przejmować. Odnośnie zrobienia tego na samej bazie: nie da się tego tak prosto zrobić (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) , a nawet jeśli udałoby się coś takiego ustawić, to skutki tego byłyby opłakane (wysoki czas wykonania zapytań, itd...) Ad. 3 Wszystko zależy od jakości twego kodu. Jeśli będzie on napisany z głową to na wydajności nie stracisz (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Inaczej ma się sprawa z logicznym podejściem bo tranzakcje stosuje się raczej do kilku powiązanych ze sobą insert'ów lub update'ów (oczywiście czasem zachodzi potrzeba na komendzie select, ale to na prawdę rzadko) . Ad. 4 Oczywiście, że powinieneś się tym przejmować, bo aby twoja aplikacja działała dobrze przy dużej ilości odwiedzin, czyli przy kilkudziesięciu wykonaniach skryptu na sekundę. Szansa, że coś się wbije pomiędzy te zapytania jest wprostproporcjonalna do ilości odwiedzin strony/serwisu www. Im więcej odwiedzin tym większe prawdopodobieństwo, że jednak ktoś trafi w przerwe i będzie źle (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Niestety nie ma żadnej alternatywy, jeśli idzie o ten problem (blokowania dostępu do danych). Niekoniecznie skrypt musi działać na tych samych danych (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Jeśli, np.: wyświetlasz, a nie obrabiasz (dane) to nic nie szkodzi, jeśli gdzieś po drodze zostanie dodana grupa rekordów (według odpowiedniego schematu wprowadzania danych). Mam nadzieję, że zrozumiałeś temat (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) @kwiateusz: Wiele baz ma swoje wewnętrzne systemy blokowania i izolacji zapytań na bazie (np. Microsoft SQL Server, Oracle, itd...). My możemy wymusić dodatkową izolację, bądź też blokadę. Z tym, że domyślne mechanizmy blokowania i izolacji operują na samych tabelach, tak by jakieś inne zapytanie nie rozwalilo struktury tabeli. Taka blokada jest ściągana po wykonaniu zapytania. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 5.10.2025 - 13:56 |