Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> php <-> db - baza danych jest blokowana na czas nawiązania połączenia - mit?
xamil
post
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:

  1. <?php
  2. $result=mysql_query("SELECT COUNT(*) clients_count FROM clients;", $connection);
  3. $row=mysql_fetch_assoc($result);
  4. echo $row['clients_count'];
  5. mysql_query("SELECT COUNT(*) clients_count FROM clients;", $connection);
  6. echo $row['clients_count'];
  7. ?>


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Zbłąkany
post
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:
  1. <?php
  2.  
  3. // To jest przykład dla PHP < 5
  4. $t = mysql_query('BEGIN TRANSACTION;',$resource);
  5. $s = mysql_query('SELECT * FROM some_table;',$resource);
  6. $i = mysql_query('INSERT INTO some_table (some_col1,some_col2) VALUES ('.$some_val1.','.$some_val2.');',$resource);
  7. if ( ! $i ) {
  8. // Kiedy coś nie poszło tak jak miało pójść cofamy tranzakcję, czyli przywracamy s
    tan bazy sprzed rozpoczęcia tranzakcji
  9. $t = mysql_query('ROLLBACK;',$resource);
  10. } else {
  11. // Jeśli wszystko jest ok zatwierdzamy zmiany
  12. $t = mysql_query('COMMIT;',$resource);
  13. }
  14.  
  15. // W PHP 5 przy użyciu PDO, nie trzeba wykonywać zapytań odnośnie tranzakcji bo sł
    użą do tego metody:
  16. // beginTransaction(), commit(), a także rollBack()
  17. ?>


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.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 13:56