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
xamil
post
Post #2





Grupa: Zarejestrowani
Postów: 158
Pomógł: 0
Dołączył: 9.01.2005

Ostrzeżenie: (0%)
-----


Ad.1. Nie potrzebnie aż tyle sie upisałeś;) W pytaniu mi chodziło jedynie czy w php4 były funkcje do tego czy trzeba było sobie radzić przez zapytania sql. Dzięki.

Ad.2-4. Dzięki za wyjaśnienia. Czyli nie pozostaje nic innego jak mieć na uwadze od dziś transakcje. Jak to tak wszystko przeanalizowałem to z jednej strony źle nie jest z moimi poprzednimi kodami z drugiej jest;)
Jeśli w kodzie występowały jakieś powiązane zapytania select to raczej nic złego stać się nie mogło. Po pierwsze dlatego, że zazwyczaj potrzebną serię danych pobierałem jednym zapytaniem stosując LEFT JOIN. Dlatego jedyne przypadki gdzie trzeba było wykonać dwa selecty to najpierw COUNT(*) na rekordach a potem pobranie ich. To również nie mogło skutkować jakimiś poważnymi konsekwencjami bo co najwyżej liczba wyników wyświetlona na stronie mogła się później nie zgodzić z faktyczną ilością (aby zabezpieczyć się przed tak trywialnym błędem nie widzę nawet sensu stosowanai transakcji). Problem jaki mogłoby sprawić to INSERT do kilku tabel które to dane stanowią jedną logiczną całość. Np. w jednej userzy a w drugiej uprawnienia ich. Wtedy po dodaniu usera a przed dodaniem uprawnień może wbić się jakiś SELECT pobierający użytkowników a wtedy mamy klops bo wyświetlą się nie pełne dane.

Najgorsze w tym wszystkim jest to, że nigdy nie zdażyła mi się sytuacja właśnie wczytania takich częściowych danych choć jest to możliwe:/ Dlatego czy ktoś może to jeszcze potwierdzić co zostało tu napisane?(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

@Zbłąkany: Dzięki wielkie za wyjaśnienia;)

Temat całkiem ciekawy. Znalazłem fajny przykład który mówi, że nawet na SELECT'ach w określonych wypadkach trzeba używać transakcji:
Cytat("za017")
Wyobraź sobie taką sytuację: dwie różne osoby odczytują z pewnej tabeli ilość dostępnych w sprzedaży przedmiotów i jednocześnie składają zamówienie na ostatnią sztukę: która z nich kupi ten przedmiot ? Transakcja uniemożliwia wystąpienie takiej sytuacji, przedmiot kupi ta osoba, która pierwsza uzyska (za pośrednictwem skryptu) dostęp do bazy danych.

W takiej sytuacji użycie transakcji jest jak najbardziej wskazane, nawet przy korzystaniu jedynie z select. gdyż pobrana z bazy danych zawartość może decydować o dalszym przebiegu wykonania skryptu, który może potem te dane modyfikować.


Ten post edytował xamil 23.02.2007, 10:10:43
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: 12.10.2025 - 23:51